SQLite中的“insert”是返回SQLITE_OK还是SQLITE_DONE?

时间:2009-06-27 15:20:34

标签: sqlite

如果成功,SQLite中的“insert”语句会返回什么?

我一直认为它应该是SQLITE_DONE,但最近在我的日志中我找到了以下字符串:

sqlite3_step error: 'not an error'

以下是记录上述字符串的代码:

prepareStatement(addTranslationStmt2, "INSERT INTO translations(lang1_wordid, lang2_wordid) VALUES(?, ?)");
if (!addTranslationStmt2) return -2;

sqlite3_bind_int(addTranslationStmt2, 1, word_id);
sqlite3_bind_int(addTranslationStmt2, 2, translation_id);

if(sqlite3_step(addTranslationStmt2) != SQLITE_DONE)
{
    NSLog(@"sqlite3_step error: '%s'", sqlite3_errmsg(database));
    sqlite3_reset(addTranslationStmt2);
    return -1;
}

sqlite3_reset(addTranslationStmt2);

我想知道,为什么它在大多数情况下都有效。 我应该将代码中的SQLITE_DONE更改为SQLITE_OK吗?

感谢。

3 个答案:

答案 0 :(得分:8)

SQLITE_DONE

http://www.sqlite.org/c3ref/step.html

您也可以尝试打印错误代码以找出问题所在。

答案 1 :(得分:3)

在这些情况下,我喜欢看代码示例。这里有一些好的:

http://sqlite.phxsoftware.com/forums/p/76/6659.aspx

SQLite Result Codes Reference列出SQLITE_OK表示成功的结果。它也是第一个错误代码,错误代码为0,使其成为规范结果(即我在成功操作时所期望的结果)。

您应该在代码中放置断点或打印语句,以确定它是否真的返回零,并检查您的数据以确保您获得预期的结果。如果全部检出,我会改变你的条件来检查SQLITE_OK。

sqlite3_step()接口行为的详细信息取决于该语句是使用较新的“v2”接口sqlite3_prepare_v2()sqlite3_prepare16_v2()还是较旧的旧接口{{1}准备的}和sqlite3_prepare()

在旧版界面中,返回值为sqlite3_prepare16().SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR。使用“v2”接口,也可以返回任何其他结果代码或扩展结果代码。

答案 2 :(得分:1)

从“调试”配置切换到“发布”为我解决了这个问题。