我有一行被初始化为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);
}
如何使用参数化查询更新列?
答案 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;
}