c++ - 似乎无法逃避我发送到我的 sqlite3 数据库的查询,不知道为什么

标签 c++ sql sqlite prepared-statement

我有这样一个字符串:

string query;
query = "insert or replace into TABLEA (a,b,c) values (@a,\"@b\",\"@c\");";

这样我就可以通过简单的替换将字符串插入到 B 和 C 中:

string instring("I have a 3\" gauge");
string instring2("I am looking for 1/8\" thickness");
Replace(&query, "@a", to_string(1));
Replace(&query, "@b", instring);
Replace(&query, "@c", instring2);

所以现在我的查询字符串是:

"insert or replace into TABLEA (a,b,c) values (1,\"I have a 3\" gauge\",\"I am looking for 1/8\" thickness\");";

SQLITE3 得到它,它看起来像:

insert or replace into TABLEA (a,b,c) values (1,"I have a 3" gauge","I am looking for 1/8" thickness");

问题是字符串过早结束。我尝试添加额外的转义字符,但这似乎也不起作用。

现在我正在使用 sqlite3_exec() 来执行所有操作。还有什么我应该做的吗?准备好的语句是否处理我正在尝试做的事情?

我是否应该使用 prepared_v2 进行尝试,这可能会解决问题?

我应该如何处理这个问题?

最佳答案

在SQL中,字符串使用单引号,转义使用两个单引号。 (为了与 MySQL 兼容,双引号被接受,但不应使用。)

您的查询应如下所示:

INSERT OR REPLACE INTO TableA(a, b, c)
VALUES (1, 'I have a 3" gauge', 'I am looking for 3/8" thickness')

或者像这样:

INSERT OR REPLACE INTO TableA(a, b, c)
VALUES (1, "I have a 3"" gauge", "I am looking for 3/8"" thickness")

但是,为了避免字符串格式问题,建议使用参数。 这就是它与直接 SQLite 函数调用的工作方式(包装器可能工作方式不同):

const char *sql = "INSERT OR REPLACE INTO TableA(a, b, c) VALUES (1, ?, ?)";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, "I have a 3\" gauge", -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, "I am looking for 3/8\" thickness", -1, SQLITE_TRANSIENT);

关于c++ - 似乎无法逃避我发送到我的 sqlite3 数据库的查询,不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633044/

相关文章:

sql - 列名以数字开头?

android.database.sqlite.SQLiteException : bind or column index out of range

c++ - 在没有正则表达式的情况下选择特定的字符串模式

c++ - 静态初始化的对象不能放在 try block 中

mysql - 如何创建与 Fusion Tables "summarize"函数等效的 MySQL 查询?

mysql - 如何在mysql数据库中获取组的开始和结束预订日期?

sqlite - SQLite:如何将默认输入类型设置为 `text`而不是 `textarea`

ruby-on-rails - RoR Michael Hartl 教程(第三)- 安装 sqlite3 时出错,Bundler 无法继续

c++ - 在 boost 匹配结果中查找不匹配项

C++:const volatile 方法