【问题标题】:Error while running sql statement on a sqlite3 db using Perl DBI使用 Perl DBI 在 sqlite3 db 上运行 sql 语句时出错
【发布时间】:2013-04-29 03:49:45
【问题描述】:

我正在尝试使用 Perl DBI 对 sqlite3 数据库运行 select 语句。以下是代码:

my $dbh = DBI->connect( "DBI:SQLite:dbname=./GenBankData.db" , "" , "" , { PrintError => 0 , RaiseError => 1 } );
    my $Sql = 'select AccessionQueryResultID, AccessionNumber, Definition from AccessionQueryResult';
    my $sth = $dbh->prepare( $Sql )  or die "Couldn't prepare statement: " . $dbh->errstr;;
    $sth->execute( $Sql) or die "Couldn't execute statement: " . $dbh->errstr;

但我收到以下错误: DBD::SQLite::st 执行失败:在 /home/mysite.cgi 第 33 行需要 0 时使用 1 个绑定变量调用

我检查了数据库和表是否存在,如果我使用 sqlite3 命令行运行查询,相同的查询可以正常工作。

谢谢

【问题讨论】:

    标签: perl sqlite dbi


    【解决方案1】:

    $sth 是一个语句句柄。它代表 SQL 语句/查询,因此必须再次向对象提供 SQL 语句是没有意义的。

    $sth->execute 期望的参数是在查询中填写可替换参数 (?) 所需的值。

    my $sth = $dbh->prepare("INSERT INTO MyTable VALUES (?, ?)");
    $sth->execute(1, "a");
    $sth->execute(2, "b");
    $sth->execute(3, "c");
    

    在你的情况下,由于你的查询不使用任何可替换的参数,你不应该传递任何参数来执行。

    $sth->execute();
    

    【讨论】:

      【解决方案2】:

      您正在使用不正确的参数调用执行命令。您已经在上一行中设置了 SQL 语句,您无需再次执行此操作。试试这个:

      $sth->execute() or die "Couldn't execute statement: " . $dbh->errstr;
      

      【讨论】:

      • Nit:die "Couldn't execute statement: " . $dbh->errstr; 永远不会被处决,因为他正在使用RaiseError
      猜你喜欢
      • 2013-11-17
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      相关资源
      最近更新 更多