如何使用C在sqlite3中使用参数化查询更新列?
我有一行被初始化为0。我想在每次执行操作时更新此行的值如何使用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
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”,表名、列名、列名)这是真的,但是这段代码不是为了解决字符串替换问题,而是为了说明它与查询参数机制是分开的。