代码之家  ›  专栏  ›  技术社区  ›  Prof. Falken

无法在sqlite、c api中准备insert语句

  •  0
  • Prof. Falken  · 技术社区  · 14 年前
      /* 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_准备_v2总是失败。

    更新: 到目前为止,我试过这些建议,但没有抽雪茄。 我用一个模式创建了我能想到的最简单的案例:

    CREATE TABLE abc(a INTEGER);
    

    上面的C代码仍然不起作用,得到“无法编译语句”。 返回代码26,这显然意味着 SQLITE_NOTADB . 所以我的数据库文件似乎不是…数据库文件。奇怪的是,我得调查一下。

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

    我把数据库文件名从“data.db”改为“data.sqlite”。现在我得到了返回代码1,sqlite_error。

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   John Ledbetter    14 年前

    我想你应该试试

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

    假设 moderation_status phonenumber email 是表中字段的名称。

    或:

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

    这个 ? 是用于插入参数的占位符。

        2
  •  2
  •   Jonathan Leffler    14 年前

    您没有提供值列表;您提供了需要值列表的名称列表(可能是列名)。

    你可能需要:

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