2017-03-06 12 views
3

sqlite3_prepare_v2を使用する場合は、すべてのパスでsqlite3_finalizeに電話する必要がありますか、成功した場合のみですか?例えば、ここで私はスウィフトの方法で使用しているコードです:それは正常に実行されなかった場合でも、ステートメントが正常に準備されて以来準備ができていない声明を完成させる必要がありますか?

let prepare = sqlite3_prepare_v2(db!, SQLString, -1, &delete, nil) 
if (prepare == SQLITE_OK){ 
    if !(sqlite3_step(delete) == SQLITE_DONE){ 
     sqlite3_finalize(delete) // * 
     sqlite3_close(db) 
     return 
    } 
} else { 
    // ** 
    sqlite3_close(db) 
    return 
} 
sqlite3_finalize(delete) 
sqlite3_close(db) 

// rest of method continues if it didn't fail 

は*私は、私はここでそれを呼び出す必要があると仮定し

**しかし、私はここでそれを呼び出す必要がありますか?

+0

は私がちょうど正常に準備がなかったものを含め、「すべてのプリペアドステートメントを確定しなければならない」かどうかについては明らかではなかった、ということを見https://www.sqlite.org/c3ref/finalize.html –

+0

を参照してください。 –

答えて

4

sqlite3_prepare_v2が失敗した場合は、sqlite3_finalizeに電話する必要はありません。

hereを参照してください:

* ppStmtはsqlite3_step()を使用して実行することができますコンパイルされ準備されたステートメントを指して残されています。エラーがある場合、* ppStmtは NULLに設定されます。

sqlite3_finalizeをNULLに設定しても問題ありません。

hereを参照:sqlite3_finalizeを呼び出す

()NULLポインタには無害何もしません。

関連する問題