http://www.3rd-impact.net/Document/SQLite/Translation/Current/capi3ref.html#sqlite3_finalize
すべての構築済みステートメントは、sqlite3_close() を呼ぶ前に、あるいは SQLITE_BUSY の戻り値で失敗して閉じる時に削除しなくてはいけません。
ステートメントが開放されてないときにsqlite3_close()を呼ぶとエラーSQLITE_BUSYが返ってデータベースが閉じられない。
(放置すると「ファイルディスクリプタいっぱいでもう開けませんエラー EMFILE」で困ることになる)
// データベースを開くのに失敗しても、データベースを閉じる result = sqlite3_open( DBFILE, &db); if( result!=SQLITE_OK ){ sqlite3_close(db); return -1; } // prepareが失敗したときは、ステートメントは開放しなくていい sql = "SELECT hoge,fuga FROM piyo LIMIT 1"; result = sqlite3_prepare( db, sql, strlen(sql), &stmt, NULL); if( result!=SQLITE_OK ){ sqlite3_finalize(stmt); // ←しなくてもいいけど、しても別に文句は言われない sqlite3_close(db); return -1; } // ここから下にはステートメントが存在する // 実行 result = sqlite3_step(stmt); if( result==SQLITE_DONE ){ // データはなかった }else if( result==SQLITE_ROW ){ // データはあったので取り出して処理とかする }else{ // エラーだった } // ステートメントを開放してからデータベースを閉じる sqlite3_finalize(stmt); sqlite3_close(db);
ステートメントがNULLでも別にエラーにはならないので、面倒だからもう、 sqlite3_finalize(stmt); sqlite3_close(db); は常にワンセットでもいいくらい。書き忘れてバグになるよりはマシ。