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

如何使用C在sqlite3中使用参数化查询更新列?,c,sqlite,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_te

我有一行被初始化为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);
}

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

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

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;
}
    
#包括
int main(int argc,char*argv[]){
字符缓冲区[256];
char*field=“你好”;
strcpy(缓冲区,“更新候选集”);
strcat(缓冲区、字段);
strcat(缓冲区“=”);
strcat(缓冲区、字段);
strcat(缓冲区,“+1;”);
返回0;
}

不能将数据库模式标识符(表或列名)绑定到SQL参数。(免责声明:我在C方面没有经验。)参数化查询往往是为值设计的,用于过滤包含SQL注入的字符串。我猜一些字符串替换函数或
sprintf
将适用于列。
snprintf()
将比所有那些
strcat()
s更好。或者更好的是,不设长度限制,并利用其
%w
格式转义idenitifer名称
char*sql=sqlite3\u mprintf(“更新\%w\”集\%w\“=\%w\”+1”,表名、列名、列名)