【问题标题】:How insert data into table by C variable?如何通过 C 变量将数据插入表中?
【发布时间】:2019-10-21 13:19:48
【问题描述】:

我要向表中插入数据,数据是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 是整数。

谢谢。

【问题讨论】:

  • 按照您的要求手动格式化 SQL 查询是危险的。您真的应该使用专用的 SQL 库来为您处理转义。
  • 如果我记得 another recent question of yours,你正在使用 sqlite。您应该使用prepared statements 的接口来实现这一点,以及正确(安全!!)绑定数据。
  • 格式化 SQL 查询 -> 我不明白,你的意思是使用 const char* 作为字符串来调用 sqlite3_exec()?我从谷歌看到这个,还有其他更好的方法吗?
  • 有时转义会随着时间而改变(以正确转义新序列),因此使用转义例程比尝试自己模仿转义例程要好得多。使用(无论哪个)提供的 SQL 转义例程会更好。
  • 为什么您不想使用 odbc 驱动程序,您将获得 BIND 参数函数,使用这些函数您可以使用这些参数执行查询。参数可以是字符串、整数等。

标签: c++ sql sqlite


【解决方案1】:

我认为这是我应该做的?

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

【讨论】:

    【解决方案2】:

    使用 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2012-07-03
      相关资源
      最近更新 更多