DBD :: SQLite :: st выполнить не удалось: несоответствие типа данных - PullRequest
3 голосов
/ 11 апреля 2010

Вот фрагмент кода Perl:

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:

[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 ]

3 голосов
/ 11 апреля 2010

Проблема заключалась в вставке 'null' для idx. Не вставлять 'idx' явно - это нормально, автоматическое приращение позаботится об этом ...

Стоит ли это сломать раньше?

2 голосов
/ 11 апреля 2010

Попробуйте сократить код до более мелких и похожих кусков, чтобы увидеть, насколько маленьким вы можете его получить, и при этом все еще демонстрировать ошибку (или, альтернативно, посмотреть, на каком этапе проблема исчезает). Вы можете удалить большую часть кода, просто вызвав execute() с запросом пустой строки, а затем начать удаление полей из оператора вставки.

Я немного подозрительно отношусь к содержимому @values, которые вы печатаете - кажется, что вокруг каждого значения, даже целых, есть кавычки, которые определенно не будут соответствовать целочисленному типу.

...