我一直在使用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;
}
数据库包含此表中的数据,但不会显示。我让它在某一点工作,但它只工作了一行然后停止了。我是愚蠢和被忽视的备份,现在我在这个混乱中,因为我试图解决它。任何帮助表示赞赏。
答案 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);