【发布时间】:2019-07-18 13:40:08
【问题描述】:
我正在尝试使用以下代码将 sqlite3 库链接到 Clion 中的 CMakeList:
find_package(SQLite3)
target_link_libraries(IIWProject SQLite::SQLite3)
库已加载,但当我运行代码时,Clion 显示以下错误:
SQL logic error
数据库已加载,但调用 sqlite3_prepare_v2(db, query, -1, &stmt, NULL) 时返回 SQL logic error
void get_db(sqlite3 **db){
int rc;
if ((rc = sqlite3_open("db_project.db", db)) != SQLITE_OK){
//fprintf(stderr, "Failed to open DB.\n");
fprintf(stderr,"Failed to open DB: %s\n\r", sqlite3_errstr(rc));
exit(EXIT_FAILURE);
}
}
int clear_table(sqlite3 *db){
sqlite3_stmt *stmt;
int rc;
char* query = "DELETE FROM resources";
if ((rc=sqlite3_prepare_v2(db, query, -1, &stmt, NULL)) != SQLITE_OK){
fprintf(stderr,"Failed to prepare statement: %s\n\r", sqlite3_errstr(rc));
return 1;
}
if ((rc = sqlite3_step(stmt)) != SQLITE_DONE){
fprintf(stderr,"Delete failed: %s\n\r", sqlite3_errstr(rc));
return 1;
}
return 0;
}
我该如何解决?
编辑:
如果我使用 gcc -lsqlite3 在没有 Clion 的情况下手动编译,它可以工作
【问题讨论】:
-
您打开的数据库中是否存在该表? (
sqlite3_errmsg()可以提供比一般错误代码更多的相关消息,顺便说一句) -
该表存在是因为如果我从 linux 控制台使用 makefile 打开同一个项目,它可以正常工作而不会出现任何错误。我无法提供更详细的错误消息,因为我不知道如何在 Clion 中检索它们。
-
您确定从命令行和 IDE 打开完全相同的数据库文件吗? -- 你会像现在一样使用
sqlite3_errmsg()而不是sqlite3_errstr()。使用方法请参考文档。) -
是的,我确定数据库是一样的。与
sqlite3_errmsg()匹配的错误是Signal: SIGSEGV (Segmentation fault) -
我...不知道您是如何设法让
sqlite3_errmsg()出现段错误的,但这令人印象深刻。您是否阅读了文档以了解其论点是什么?您是否收到任何编译器警告,但您确实尝试使用它?