“S”附近的SQLite语法不正确

时间:2017-04-08 14:48:25

标签: c++ sqlite

我一直在使用SQLite + C ++进行一段时间的项目,我似乎无法让它工作。现在,我的代码没有在控制台中显示任何内容。我得到的错误是syntax incorrect near "S"。我的代码是:

/*Definitions*/
sqlite3 *db;
sqlite3_stmt *statement;
void *arg;
char *err;
const char stmt = *"SELECT * from table";
/*End of Definitions*/

int exec(void *arg, int argc, char **argv, char **column) {
    while(true) {
        int i = 0;
        for(i < argc;) {
            cout << column[i] << ": " << argv[i] << endl;
            i++;
        }
        cout << "------" << endl;
    }
}

int main() {
    int rc = sqlite3_open("test.sqlite", &db); /*Open db "test.sqlite"*/
    if(!rc) {
        sqlite3_exec(db, &stmt, exec, arg, &err);
    }
    /*Ending Stuffz (NOTHING BEYOND THIS POINT)*/
    cin.get();
    return 0;
}

数据库包含此表中的数据,但不会显示。我让它在某一点工作,但它只工作了一行然后停止了。我是愚蠢和被忽视的备份,现在我在这个混乱中,因为我试图解决它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

问题从这一行开始:

const char stmt = *"SELECT * from table";

这会创建一个单个 char,其值为'S',从字符串文字中复制,因为应用于字符串文字的星号只会让您获得第一个字符char const[]并忽略其余部分。

然后,您可以在此处向SQLite提供char对象的地址:

sqlite3_exec(db, &stmt, exec, arg, &err);

该函数需要char const*作为其第二个参数。虽然its documentation没有明确说明,但自然希望指向空终止char数组的指针,而不是单个char

因此,您在此处遇到未定义的行为,因为该函数一直在寻找终止'\0',进入内存时不允许访问。

你也是运气不好,因为不是崩溃而是告诉你错误的位置,显然发生了一个可访问的'\0' 恰好发生就在内存中'S'

所以你实际上将单个字母“S”作为SQL字符串传递,并且函数正确地抱怨了。

治愈很容易:

const char* stmt = "SELECT * from table";

[...]

sqlite3_exec(db, stmt, exec, arg, &err);