我想将数据INSERT INTO表,数据是C变量。
这是我当前的代码:
const char* sqlUpdateTable = "INSERT INTO MyTable
VALUES(25, 'String1', 'String2')
ON CONFLICT (id)
DO
UPDATE SET name = 'New String';";
实际上,不仅'String1'、'String2'和'New String'需要是变量,id也是C/C++变量。
id 很长。
String1 是双精度的。
String2 是 int。
谢谢。
使用 sprintf()
char buffer [200];
double mydouble = 4.0;
long mylong = 2;
int myint = 4;
int n=sprintf (buffer, "INSERT INTO MyTable VALUES(25, '%f', '%i') ON CONFLICT (%l) DO UPDATE SET name = 'New String';", mydouble, myint , mylong);
我认为这是我应该做的?
sqlite3_stmt* res;
const char* sqlInsert = "INSERT INTO MyTable VALUES(NULL, ?, ?);";
sqlite3_prepare_v2(db, sqlInsert, -1 , &res, 0);
const char* test1 = "ABC";
const char* test2 = "XYZ";
if (sqlite3_bind_text( res, 1, test1, 3, 0 ) != SQLITE_OK)
{
printf("\nError 1.\n");
}
if (sqlite3_bind_text(res, 2, test2, 3, 0) != SQLITE_OK)
{
printf("\nError 2.\n");
}
int step = sqlite3_step(res);
您可以使用准备好的 SQL 语句。你不仅可以,而且应该。就安全性而言,它们是更好的选择,因为它们可以防止 SQL 注入(更多信息:https://www.w3schools.com/sql/sql_injection.asp) 即使您不接受用户的输入,您也应该考虑使用准备好的语句,因为这是一种良好且安全的做法。
以准备好的语句开始,声明 SQL 命令,但在要插入数据的地方使用问号。让我们这样做:
char* sqlUpdateTable = "INSERT INTO MyTable VALUES(NULL, ?, ?);";
然后,声明稍后执行时将传递的
sqlite3_stmt*
指针:
sqlite3_stmt* res;
现在,使用
sqlite3_prepare
函数准备数据库:
sqlite3_prepare_v2(db, sqlUpdateTbale, -1 , &res, 0);
现在您可以声明要插入到准备好的语句中的变量,也可以从用户输入中获取它们。如果从用户输入中获取值,请使用
scanf
函数。例如:
const char* input;
scanf("%s", input);
如果您不想接受用户输入,只需声明一个字符串并为其赋予一个值即可。现在是时候将此字符串绑定到
sqlite3_stmt
:
int bind_to_stmt = sqlite3_bind_text(res, 1, input, strlen(input), 0);
执行
sqlite3_bind_text
功能后,检查是否有可能发生的错误。通常,如果没有发生错误,sqlite3 函数会返回 SQLITE_OK
。因此,要检查错误,请检查 bind_to_stmt
是否不等于 SQLITE_OK
:
if(bind_to_stmt != SQLITE_OK)
{
printf("Error binding to sqlite3_stmt.\n");
return 1;
}
重复相同的过程来绑定第二个变量。现在是执行语句的时候了。您可以使用
sqlite3_step
函数来实现此目的:
int exec = sqlite3_step(res);
我们再次检查是否有错误。
if(exec != SQLITE_OK)
{
printf("Error executing statement.\n");
return 2;
}
希望这至少能向您解释一些事情。