2010-04-11 8 views
3

여기 펄 코드의 SNIPPIT입니다 :DBD :: SQLite는 :: 일이 실패 실행 : 데이터 형식이 일치하지

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. 

$ 삽입의 값보고 있어요 :

[null '1270950742' '1270951642' 'asdf' 'asdf' 'adsf' 15 ''] 
:
[INSERT INTO timesheet(idx,Start_Time,End_Time,Project,Ticket_Number,Site,Duration,Notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?);] 

여기 @values ​​있습니다

여기 여기 일이 줄 방법은 '출퇴근'

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'은 어디에서 왔습니까? 펄에서는'undef'라고 쓰여 있습니다. – friedo

+0

그건 데이터베이스의 null 필드입니다 ...하지만, 네, 그게 문제의 원인이었습니다. 이 이상한 부분은이 버그가 null도 사용하는 코드 개정으로 나타났습니다 ... 거기에는 문제가 없었습니다. 내가 전에하고 있었던 일에 대해 좀 더 자세히 살펴 봐야 할 것입니다 ... –

답변

2

코드를 작고 비슷한 크기로 축소하여 크기를 줄이고 오류를 표시하십시오 (또는 문제가 사라지는 단계를 참조하십시오). 맨손으로 문자열 쿼리를 사용하여 execute()을 호출하고 많은 코드를 제거한 다음 insert 문에서 필드를 제거하기 시작할 수 있습니다.

당신이 인쇄하는 @values의 내용에 대해 조금 의심 스럽습니다. 모든 값 주위에 따옴표가 있고 심지어 정수 유형과 정확하게 일치하지 않는 정수도 나타납니다.

+0

아니요 ... 하나의 정수 값만 있습니다 : 지속 시간, 값은 15, * 따옴표로 묶이지 않음 *. 나는 분명히 코드를 줄이고 무언가가 떨어지는 지 볼 것이다. –

2

문제는 idx에 'null'을 삽입하는 것이 었습니다. 명시 적으로 'idx'를 삽입하지 않아도됩니다. 자동 증가가 그 값을 처리합니다 ...

이전에이를 깨뜨린 것이 좋을 것입니다.