【问题标题】:Failed to execute sqlite3 in C application在 C 应用程序中执行 sqlite3 失败
【发布时间】:2017-07-03 22:57:21
【问题描述】:

我正在尝试使用 C 应用程序显示 firefox 和 chrome 的历史记录。对于 chrome 的历史记录,它运行良好,因为 Sql 命令不包含符号,但使用 chrome 我的 sql 请求包含符号,所以这个函数没有t 给我结果。它给我错误:

没有这样的表:moz_historyvisits

或者,当我从命令提示符测试此请求时,它运行良好。我认为问题在于 sql 请求包含 (_)symbols 。 Rq:对于 chrome 历史,它运行良好。 CallbackFirefox 是用来显示结果的功能 我使用 windows 和 Code blocks 作为 IDE。当我从 sqlite_master 执行选择名称时

int DisplayFirefoxHistory()
    {
     sqlite3 *db;
    char *err_msg = 0;

    system("cd C:/Users/******/AppData/Roaming/Mozilla/Firefox/Profiles/*.default");
    int rc = sqlite3_open("places.sqlite", &db);

    if (rc != SQLITE_OK) {
    fprintf(stderr, "Cannot open database: %s\n",sqlite3_errmsg(db));
    sqlite3_close(db);
           return 1;
        }

char *sql = "select url,datetime(visit_date/1000000-11644473600,'unixepoch') from  moz_historyvisits,moz_places order by visit_date desc";

        rc = sqlite3_exec(db, sql, callbackFirefox, NULL, &err_msg);

        if (rc != SQLITE_OK ) {

            fprintf(stderr, "Failed to select data\n");
            fprintf(stderr, "SQL error: %s\n", err_msg);

            sqlite3_free(err_msg);
            sqlite3_close(db);

            return 1;
        }

        sqlite3_close(db);
    return 0;
    }

【问题讨论】:

  • 您确定您的代码打开了正确的数据库吗?
  • 是的,当我在命令提示符中复制和粘贴相同的 sql 命令时,它运行良好的问题。这不是环境或库的问题,因为 sqlite3 在显示 chrome 历史记录时有效
  • 您说是,但您的代码报告它无法在您的 SQL 中找到您通过在命令行工具中运行 SQL 证明存在的表。尝试用“SELECT name FROM sqlite_master”替换您的 SQL 并打印出结果以查看您的代码正在查找哪些表
  • 对不起,它显示给我这个。 moz_historyvisits,moz_places 存在。我在帖子中添加图片

标签: c sqlite


【解决方案1】:
system("cd C:/Users/******/AppData/Roaming/Mozilla/Firefox/Profiles/*.default");

system() 启动一个单独的 shell,该 shell 在命令执行后终止,因此这不会更改实际程序的当前目录。

您应该手动找出目录名称,并将其包含在数据库文件名中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多