【问题标题】:How to fix : Sql logic error sqlite3 in Clion?如何修复:Clion 中的 Sql 逻辑错误 sqlite3?
【发布时间】: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() 出现段错误的,但这令人印象深刻。您是否阅读了文档以了解其论点是什么?您是否收到任何编译器警告,但您确实尝试使用它?

标签: c sqlite cmake clion


【解决方案1】:

现在我们已经确定当您通过 IDE 运行程序时该表不存在...

通过命令行运行程序时的当前工作目录与 IDE 运行它时的当前工作目录不同。由于您使用的是数据库文件的相对路径,这意味着您使用的是不同的一个取决于你如何运行你的程序。只有一个数据库实际上有您尝试使用的表。

一些解决方案:

  • 使用数据库的绝对路径。
  • 将 IDE 配置为使用与通过命令行运行程序时相同的工作目录。

【讨论】:

  • 非常感谢,我通过在 CMakeList.txt 中添加 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 解决了
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多