【问题标题】:DBD::SQLite::st execute failed: datatype mismatchDBD::SQLite::st 执行失败:数据类型不匹配
【发布时间】:2012-04-28 01:07:45
【问题描述】:

这里有一段 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
''

...我看不到数据类型不匹配。

【问题讨论】:

  • null 来自哪里?在 Perl 中,拼写为 undef
  • 这是数据库中的一个空字段......但是,是的,它导致了问题。奇怪的是,这个错误是作为代码的修订版突然出现的,它也使用了 null ......并且它没有在那里引起问题。我得仔细看看我之前在做什么......

标签: perl dbi type-mismatch


【解决方案1】:

问题在于为 idx 插入“null”。不显式插入“idx”是可以的,自动增量会处理这个问题......

应该早点打破它。

【讨论】:

    【解决方案2】:

    尝试将您的代码缩减为更小且相似的块,看看您可以得到多小并且仍然显示错误(或者,查看问题在哪一步消失)。您可以通过使用裸字符串查询调用execute() 来删除大量代码,然后开始从插入语句中删除字段。

    我对您正在打印的 @values 的内容有点怀疑 - 似乎每个值都有引号,即使是整数,也肯定不会匹配整数类型。

    【讨论】:

    • 不...只有一个整数值:Duration,其值为 15,它是 not 引用的。我一定会减少代码,看看有没有什么问题。
    猜你喜欢
    • 2019-07-07
    • 2023-04-11
    • 2020-06-01
    • 2014-11-09
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多