我写了下面的代码:
$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
有人可以解释这条警告信息的含义吗?
答案 0 :(得分:3)
您发布的代码是正确的(第1行的语法错误除外)
此外,您的错误在“23”行,而您发布的代码没有23行。
我认为错误是您代码中的其他位置。
编辑: 你使用什么版本的SQLite模块?我瞪了一眼,发现:http://www.perlmonks.org/?node_id=665714
问题是DBD :: SQlite-> disconnect()方法执行 sqlite3_close()函数。如果是,此函数返回SQLITE_BUSY 有任何积极的声明。来自API:“应用程序应该 完成所有准备好的语句并关闭与之关联的所有BLOB 尝试关闭sqlite3对象之前的sqlite3对象。“ 目前,DBD :: SQLite只能通过DESTROY方法完成语句。 在最简单的情况下,您可以始终使用“undef $ sth”或等待直到它 超出范围,最终确定声明。但如果你准备好了 通过缓存(prepare_cached)语句它不适合你,因为 语句直到DBI缓存中。在这种情况下,我们可以调用DESTROY 在我们的缓存语句中仅通过DESTROY用于数据库处理程序。和我们 可以通过“undef $ dbh”实现它。 “undef $ dbh” - 将关闭所有缓存 语句和关闭数据库没有任何错误。结论:避免 对DBD :: SQLite使用$ dbh-> disconnect(),而不是使用“undef $ dbh”。
此致
jfried