如何使用C在sqlite3中使用参数化查询更新列?

时间:2019-04-02 14:31:01

标签: c sqlite

我有一行被初始化为0。我想在每执行一次操作时更新该行的值。

char *text="Hello" // Hello is the name of the field, which has one row    
char *sql = "UPDATE Candidate SET ?=?+1;";


rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);

if (rc == SQLITE_OK) {  
    rc = sqlite3_bind_text( res, 1,text,-1,0);
    rc = sqlite3_bind_text( res, 2,text,-1,0);
}

如何使用参数化查询更新列?

1 个答案:

答案 0 :(得分:0)

您不能将表或列名称绑定到SQL参数值。从SQLite documentation

  

6。绑定参数和重用准备好的语句

     

。 。

。      

SQLite允许在允许使用字符串文字,数字常量或NULL的任何地方使用参数。 (参数不能用于列名或表名。)参数采用以下形式之一:

     

•?
  •?NNN
  •:AAA
  •$ AAA
  •@AAA

     

在上面的示例中,NNN是整数值,AAA是标识符。参数最初的值为NULL。在第一次调用sqlite3_step()之前或在sqlite3_reset()之后立即调用,应用程序可以调用sqlite3_bind()接口将值附加到参数。每次调用sqlite3_bind()都会覆盖同一参数上的先前绑定。

     

允许应用程序预先准备多个SQL语句并根据需要对其进行评估。未完成的准备好的语句的数量没有任意限制。一些应用程序在启动时会多次调用sqlite3_prepare()来创建他们将需要的所有准备好的语句。其他应用程序保留最近使用的准备好的语句的缓存,然后在可用时将准备好的语句从缓存中重用。另一种方法是仅在循环中使用已准备好的语句时再使用它们。

如果要在这种情况下使用变量列名,则必须在运行时动态构造查询字符串,这不在此问题的范围内;像这样的事情可能会起作用,但是如果您打算经常这样做,那么值得花时间编写一个字符串替换函数:

#include <string.h>

int main(int argc, char *argv[]) {
    char buffer[256];
    char *field = "Hello";

    strcpy(buffer, "UPDATE Candidate SET ");
    strcat(buffer, field);
    strcat(buffer, " = ");
    strcat(buffer, field);
    strcat(buffer, " + 1;");
    return 0;
}