无法在SQLITE,C API中准备INSERT语句

时间:2010-10-17 23:52:14

标签: c sqlite

  /* 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。 在我未经编辑的问题中接受指出语法错误的答案之一。

2 个答案:

答案 0 :(得分:3)

我想你应该试试

const char* zSql = 
    "INSERT INTO abc (moderation_status, phonenumber, email) VALUES(?,?,?)";

假设moderation_status phonenumberemail是表格中字段的名称。

或:

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个问题。)