2017-03-06 54 views
3

使用sqlite3_prepare_v2時,是否需要在每個路徑中調用sqlite3_finalize,或者只有在成功時才調用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

用NULL調用sqlite3_finalize並沒有什麼壞處。

參見here

上NULL指針調用sqlite3_finalize()是一種無害的無操作。