2010-10-17 46 views
0
/* 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总是失败。无法在SQLITE中准备INSERT语句,C API

更新: 我尝试了迄今为止的建议,但没有雪茄。 我创造了我能想到的最简单的情况下,用一个模式:

CREATE TABLE abc(a INTEGER); 

,并在上述C代码,仍然不能正常工作,得到“无法编译声明” 了返回码26这显然意味着SQLITE_NOTADB 。所以看起来我的数据库文件不是......数据库文件。奇怪的是,我将不得不考虑这一点。

如果我使用“.dump”命令,sqlite CLI接受该文件并可以显示模式。

我将数据库文件名从“data.db”更改为“data.sqlite”。现在我得到的返回码为1,SQLITE_ERROR,而不是。

更新: 我在访问错误的文件,AKA user error。 接受在我未编辑的问题中指出语法错误的答案之一。

+0

SQLite返回什么?你的代码似乎没问题。也许这是列/表名称不匹配或违反约束? – valdo 2010-10-18 08:21:26

+0

@valdo,它是目前唯一的表格。 – 2010-10-18 08:38:05

回答

3

我想你应该尝试

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

假设moderation_statusphonenumberemail在表中的字段的名称。

或:

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

?是用于这里的参数将被插入的占位符。

+0

揍我一秒!我知道我不应该对我的回答做最后的调整:) – 2010-10-17 23:59:32

+0

这就是你得到的详细和解释你的答案:P – 2010-10-18 00:01:28

2

您尚未提供任何值的列表;您提供了需要列表值的名称列表(可能是列名称)。

您可能需要:

char* zSql = "INSERT INTO abc(moderation_status, phonenumber, email) " 
      "VALUES('U', '212-234-6678', '[email protected]')"; 

或者你可能不与列名打扰:

char* zSql = "INSERT INTO abc VALUES('U', '212-234-6678'," 
      "'[email protected]')"; 

或者您可以使用占位符:如果您使用占位符

char* zSql = "INSERT INTO abc VALUES(?, ?, ?)"; 

,您在执行语句时必须提供相应的值。 (但占位符通常是最好的解决方案 - 它们避免了SQL Injection问题。)

+0

谢谢。这是一个很大的帮助。 – 2010-10-18 10:51:03