【问题标题】:DBD:SQLite disconnectDBD:SQLite 断开连接
【发布时间】:2011-10-11 17:14:11
【问题描述】:

我写了以下代码:

$dbh = DBI->connect('dbi:SQLite:mysqlite.db', "", "") || die "Cannot connect: $DBI::errstr";

my $sth = $dbh->prepare("select value1, value2 from valus_table where value2 = 4");

$sth->execute();

while (my @row = $sth->fetchrow_array) {
    print $row[0], $row[1], "\n";
}

$sth->finish;

$dbh->disconnect();

并收到此警告:

closing dbh with active statement handles at mysqlib.pl line 23

有人能解释一下这个警告信息的含义吗?

【问题讨论】:

    标签: perl sqlite cpan dbi


    【解决方案1】:

    您发布的代码是正确的(第 1 行的语法错误除外)

    您的错误也在“23”行,您发布的代码没有 23 行。

    我认为错误在您的代码中的其他地方。

    编辑: 您使用什么版本的 SQLite 模块?我凝视了一下,发现:http://www.perlmonks.org/?node_id=665714

    问题在于 DBD::SQlite->disconnect() 方法执行 sqlite3_close() 函数。此函数返回 SQLITE_BUSY 以防万一 有任何积极的声明。来自 API:“应用程序应该 完成所有准备好的语句并关闭所有与 尝试关闭 sqlite3 对象之前的 sqlite3 对象。” 目前 DBD::SQLite 只能通过 DESTROY 方法完成语句。 在最简单的情况下,您始终可以使用“undef $sth”或等到它 超出将完成声明的范围。但如果你准备好了 通过缓存(prepare_cached)声明它对你不起作用,因为 语句直到在 DBI 缓存中。在这种情况下,我们可以调用 DESTROY 仅通过 DESTROY 对我们的缓存语句进行数据库处理程序。和我们 可以通过“undef $dbh”来实现。 "undef $dbh" - 将关闭所有缓存 语句和关闭数据库没有任何错误。结论:避免 对 DBD::SQLite 使用 $dbh->disconnect(),而不是使用“undef $dbh”。

    问候,

    jfried

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2014-07-17
      • 2016-11-13
      • 2016-08-21
      • 1970-01-01
      • 2016-08-26
      • 2016-11-15
      相关资源
      最近更新 更多