2011-07-23 54 views
1

我寫了下面的代碼:DBD :: SQLite的斷開

$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 

有人能解釋這個警告信息的含義?

回答

3

您發佈的代碼是正確的(除了第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