繁体   English   中英

DBD:SQLite断开连接

[英]DBD:SQLite disconnect

我写了下面的代码:

$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

有人可以解释此警告消息的含义吗?

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

另外,您的错误位于“ 23”行,而您发布的代码没有23行。

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

编辑:您使用哪个版本的SQLite模块? 我瞥了一眼,发现: http ://www.perlmonks.org/?node_id=665714

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

问候,

jfried

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM