我有一个这样的字符串:

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/

10-09 21:04