2011-07-23 9 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モジュールのどのバージョンを使用していますか?私は少しgoggledとことが判明:http://www.perlmonks.org/?node_id=665714

問題はDBD :: SQlite->切断()メソッドは 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
関連する問題