/* DATABASE INIT */
ret = sqlite3_open_v2(dbfile, &DB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
if (SQLITE_OK != ret) {
printf("Could not open database.\n");
exit(1);
}
const char* zSql = "INSERT INTO abc VALUES (?)";
ret = sqlite3_prepare_v2(sites[DB, zSql, strlen(zSql), &s, NULL);
if (SQLITE_OK != ret) {
printf("Could not compile statement '%s', got %d.\n", zSql, ret);
exit(1);
}
嗯,你去吧。怎么了? sqlite3_prepare_v2总是失败。
更新: 我到目前为止尝试了这些建议,但没有雪茄。 我用模式创建了我能想到的最简单的案例:
CREATE TABLE abc(a INTEGER);
如上所述的C代码仍然不起作用,得到'无法编译语句'
得到返回代码26,显然意味着SQLITE_NOTADB
。所以我的数据库文件似乎不是......数据库文件。奇怪,我将不得不研究这个。
如果我使用“.dump”命令,sqlite CLI会接受该文件并显示架构。
我将数据库文件名从“data.db”更改为“data.sqlite”。现在我得到的返回码为1,即SQLITE_ERROR。
更新的 我正在访问错误的文件,AKA user error。 在我未经编辑的问题中接受指出语法错误的答案之一。
答案 0 :(得分:3)
我想你应该试试
const char* zSql =
"INSERT INTO abc (moderation_status, phonenumber, email) VALUES(?,?,?)";
假设moderation_status
phonenumber
和email
是表格中字段的名称。
或:
const char* zSql = "INSERT INTO abc VALUES(?,?,?)";
?
是插入参数的占位符。
答案 1 :(得分:2)
您尚未提供值列表;您已经提供了一个名称列表(可能是列名称),其中需要一个值列表。
您可能需要:
char* zSql = "INSERT INTO abc(moderation_status, phonenumber, email) "
"VALUES('U', '212-234-6678', 'example@example.com')";
或者你可能不打扰列名:
char* zSql = "INSERT INTO abc VALUES('U', '212-234-6678',"
"'example@example.com')";
或者您可以使用占位符:
char* zSql = "INSERT INTO abc VALUES(?, ?, ?)";
如果使用占位符,则在执行语句时必须提供相应的值。 (但占位符通常是最好的解决方案 - 它们可以避免SQL Injection个问题。)