2010-04-11 61 views
3

這裏是一個Perl代碼SNIPPIT:DBD :: SQLite的:: ST執行所失敗:數據類型不匹配

sub insert_timesheet { 
    my $dbh = shift; 
    my $entryref = shift; 
    my $insertme = join(',', @_); 
    my $values_template = '?, ' x scalar(@_); 

    chop $values_template; 
    chop $values_template; #remove trailing comma 

    my $insert = "INSERT INTO timesheet($insertme) VALUES ($values_template);"; 
    my $sth = $dbh->prepare($insert); 
     debug("$insert"); 
    my @values; 
    foreach my $entry (@_){ 
     push @values, $$entryref{$entry} 
    } 
     debug("@values"); 
    my $rv = $sth->execute(@values) or die $dbh->errstr; 
     debug("sql return value: $rv"); 
    $dbh->disconnect; 
} 

我看到的錯誤

DBD::SQLite::st execute failed: datatype mismatch at timesheet line 85. 

$插入的值:

[INSERT INTO timesheet(idx,Start_Time,End_Time,Project,Ticket_Number,Site,Duration,Notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?);] 

這裏有@values:

[null '1270950742' '1270951642' 'asdf' 'asdf' 'adsf' 15 ''] 

這裏的「時間表」

timesheet( 
    idx INTEGER PRIMARY KEY AUTOINCREMENT 
    , Start_Time VARCHAR 
    , End_Time VARCHAR 
    , Duration INTEGER 
    , Project VARCHAR 
    , Ticket_Number VARCHAR 
    , Site VARCHAR 
    , Notes VARCHAR 
) 

的模式這裏的東西怎麼排隊:

---- 
Insert Statement 
Schema 
@values 
---- 

idx 
idx INTEGER PRIMARY KEY AUTOINCREMENT 
null: # this is not a mismatch, passing null will allow auto-increment. 

Start_Time 
Start_Time VARCHAR 
'1270950742' 

End_Time 
End_Time VARCHAR 
'1270951642' 

Project 
Project VARCHAR 
'asdf' 

Ticket_Number 
Ticket_Number VARCHAR 
'asdf' 

Site 
Site VARCHAR 
'adsf' 

Duration 
Duration INTEGER 
15 

Notes 
Notes VARCHAR 
'' 

...我無法看到數據類型不匹配。

+2

'null'從哪裏來?在Perl中拼寫爲'undef'。 – friedo 2010-04-11 06:02:37

+0

這是數據庫中的一個空字段......但是,是的,它導致了這個問題。 這個奇怪的部分是,這個bug作爲代碼的修訂版本彈出來,它也使用null ...並且它不會在那裏造成問題。我不得不仔細看看之前我在做什麼...... – 2010-04-11 06:41:18

回答

2

嘗試將您的代碼縮小到更小和類似的塊,看看您能得到它有多小,仍然會出現錯誤(或者查看問題在哪一步消失)。只需通過使用裸字符串查詢調用​​,然後開始從插入語句中刪除字段,就可以刪除大量代碼。

我對您正在打印的@values的內容有點懷疑 - 看起來每個值都有引號,即使是整數,也不會與整數類型匹配。

+0

不......只有一個整數值:持續時間,其值是15,它是*不*引用。 我一定會減少代碼,看看是否有東西掉出來。 – 2010-04-11 04:59:24

2

問題在於爲idx插入'null'。沒有明確地插入'idx'是好的,自動增量處理這個...

應該早點解決這個問題。