2017-03-06 61 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()是一种无害的无操作。