DBD: отключение SQLite - PullRequest
       13

DBD: отключение SQLite

1 голос
/ 23 июля 2011

Я написал следующий код:

$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 Ответ

3 голосов
/ 23 июля 2011

правильный код, который вы разместили (за исключением синтаксической ошибки в строке 1)

Также ваша ошибка в строке "23", а в опубликованном вами коде нет 23 строк.

Я думаю, что ошибка в другом месте вашего кода.

Edit: Какую версию вы используете модуль 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" - закроет все кэшированные заявления и закрыть базу данных без каких-либо ошибок. Вывод: избегать используя $ dbh-> disconnect () для DBD :: SQLite, вместо этого используйте "undef $ dbh".

С уважением,

jfried

...