如何通过C变量向表中插入数据?

问题描述 投票:0回答:3

我想将数据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。

谢谢。

c++ sql sqlite
3个回答
0
投票

使用 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);

参见: http://www.cplusplus.com/reference/cstdio/sprintf/


0
投票

我认为这是我应该做的?

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);

0
投票

您可以使用准备好的 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;
}

希望这至少能向您解释一些事情。

© www.soinside.com 2019 - 2024. All rights reserved.