【问题标题】:Debugging an SQLite query from a C program从 C 程序调试 SQLite 查询
【发布时间】:2011-10-10 19:17:11
【问题描述】:

我有一个 SQL 表,其中一列有几个逗号分隔值。如果列表中存在特定值,则下面的代码应该遍历所有这些并返回 true,但是它似乎仅适用于条目中第一个值以外的值。关于我在哪里搞砸的任何想法?使用 sqlite3 直接在数据库文件上运行时,查询工作正常,所以我确定问题出在这个函数上。

bool group_exists(char *group)
{
    int retv;
    char *param_1, *param_2;
    bool exists = false;
    sqlite3_stmt *p_stmn;

    param_1 = malloc(BUFFER_SIZE);
    param_2 = malloc(BUFFER_SIZE);

    sprintf(param_1, "%s,%%", group);
    sprintf(param_2, "%%,%s,%%", group);

    sqlite3_prepare_v2(db, "SELECT groups FROM users WHERE groups LIKE ? OR groups LIKE ?", -1, &p_stmn, NULL);
    sqlite3_bind_text(p_stmn, 1, param_1, -1, NULL);
    sqlite3_bind_text(p_stmn, 1, param_2, -1, NULL);
    retv = sqlite3_step(p_stmn);

    if (retv == SQLITE_ROW) {
        exists = true;
    } else if (retv != SQLITE_DONE) {
        retval_crash();
    }

    free(param_1);
    free(param_2);
    sqlite3_finalize(p_stmn);

    return exists;
}

【问题讨论】:

  • 逗号有必要吗?显示您在没有?s 的情况下在 sqlite3 中使用的预期/工作查询,以便我可以理解您试图实现的类似语句。如果可用,也使用snprintf,并检查sqlite3_prepare_v2 以获得SQLITE_OK
  • 查询是“SELECT groups FROM users WHERE groups LIKE '%,foobar,%' OR groups LIKE 'foobar,%'”,其中 foobar 是我要检查的组。问题是该字段包含一个逗号分隔的值列表,例如,“foobar”不应该匹配“foo,foobarba”。我知道从 SQLite 获取整个字符串,然后在 C 中匹配它可能会更整洁,但这会使代码的其他部分复杂化,所以我希望改为解决这个问题。
  • 问题是该字段包含一个逗号分隔的值列表停在那里并在之后放置一个句点。一旦解决了直接的sqlite3_bind_text 索引问题,您可能需要查看您的架构。

标签: c sqlite


【解决方案1】:

确保将索引绑定到正确的 sql 参数。

sqlite3_bind_text(p_stmn, 1, param_1, -1, NULL);
sqlite3_bind_text(p_stmn, 2, param_2, -1, NULL);

在尝试调试 sqlite 时,请务必检查 result codes 以确保一切成功。

【讨论】:

  • 谢谢!我不敢相信在盯着这段代码这么久之后我没有注意到这一点。
  • 从我在上面的 cmets 中的问题可以看出,我错过了。直到我浏览了每个方法的文档,才看到“第二个参数是要设置的 SQL 参数的索引。最左边的 SQL 参数的索引为 1。”
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多