我在Ubuntu(c ++)上使用Sqlite3有以下代码:
void test_function(dbHandler)
{
char *retError = 0;
std::string sql("INSERT INTO LOG (LAST_CHANGED_DATE_TIME) VALUES ('TEST');");
int returnStatus = sqlite3_exec(dbHandler, sql.c_str(), 0, 0, &retError);
std::cout << "RetStatus = " << returnStatus << "; " << retError << s
if (returnStatus == SQLITE_OK)
return sqlite3_changes(dbHandler);
else
{
sqlite3_free(retError);
sqlite3_close(dbHandler);
}
}
Run Code Online (Sandbox Code Playgroud)
该sqlite3_exec语句sql在测试其失败行为时是错误的(在这种情况下,字段名称不匹配).我得到了正确的状态sqlite3_exec:
Status = 1; table Log has no column named last_changed_date_time
Run Code Online (Sandbox Code Playgroud)
由于这是一个错误,我需要释放错误消息(retError)并关闭数据库连接.这是我遇到问题的地方:
在调用时sqlite3_close,我收到以下异常消息:
unable to close due to unfinalized statements or unfinished backups
Run Code Online (Sandbox Code Playgroud)
我浏览了sqlite3文档并且无法找到我在这里发布的内容......
基于此我需要帮助:
a)修复上面的代码.
b)了解在出现错误时从sqlite3_exec恢复的正确方法.
谢谢你的帮助.
a) 应以 结尾的输出行std::endl;。参数dbHandler必须有类型。void 函数不能没有返回值。但是,关于使用 sqlite3 api,发布的代码是正确的。
b) 如果发生错误,sqlite3_exec将进行恢复。retError您只需要使用sqlite3_free您已经在执行的操作来释放 指向的内存。
下面是一个最小的运行示例,其中修复了我描述的 3 个错误。它表明它是正确的(“按顺序调用的库例程”输出是因为您无法调用sqlite3_errmsg关闭的数据库句柄),因为它不会产生您所描述的错误。因此,如果sqlite3_close失败,那是因为程序中其他地方出现错误。
您所描述的错误可以通过取消注释 3 行注释来重现。然后将创建的语句sqlite3_prepare不会被调用清除sqlite3_finalize,因此sqlite3_close将导致“由于未完成的语句或未完成的备份而无法关闭”错误。您的错误可能是由类似的原因引起的。
#include <iostream>
#include <sqlite3.h>
void test_function(sqlite3 * dbHandler)
{
char *retError = 0;
std::string sql("INSERT INTO LOG (LAST_CHANGED_DATE_TIME) VALUES ('TEST');");
int returnStatus = sqlite3_exec(dbHandler, sql.c_str(), 0, 0, &retError);
std::cout << "RetStatus = " << returnStatus << "; " << retError << std::endl;
if (returnStatus == SQLITE_OK)
return; // sqlite3_changes(dbHandler);
else
{
sqlite3_free(retError);
sqlite3_close(dbHandler);
}
}
int main()
{
sqlite3 * dbHandler;
sqlite3_open("test.sqlite", &dbHandler);
sqlite3_exec(dbHandler, "CREATE TABLE LOG (DUMMY);", 0, 0, 0);
// sqlite3_stmt * test;
// const char * sql = "INSERT INTO LOG (DUMMY) VALUES ('TEST');";
// sqlite3_prepare(dbHandler, sql, -1, &test, 0);
test_function(dbHandler);
std::cout << "Last error: " << sqlite3_errmsg(dbHandler) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
916 次 |
| 最近记录: |