SQLite 语法在 "S" 附近不正确

SQLite syntax incorrect near "S"

本文关键字:不正确 SQLite 语法      更新时间:2023-10-16

我已经使用 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;
}

数据库包含此表中的数据,但不会显示。我让它在某一点工作,但它只工作了一行然后停止了。我很愚蠢,忽略了备份,现在当我试图修复它时,我陷入了困境。任何帮助,不胜感激。

问题从这一行开始:

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

这将创建一个char其值'S'从字符串文本中复制,因为像这样应用于字符串文本的星号只会获取char const[]的第一个字符,而忽略其余字符。

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

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

该函数需要char const*作为其第二个参数。尽管其文档没有明确说明,但它自然期望指向以 null 结尾的char数组的指针,而不是指向单个char

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

您也很不幸,因为显然发生的事情不是崩溃从而向您显示错误的位置,而是在'S'之后恰存在一个可访问的''

因此,您有效地将单个字母"S"作为SQL字符串传递,并且该函数对此进行了正确的抱怨。

治愈很容易:

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

[...]

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