4

我有一个这样的字符串:

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试试,这可能会解决问题吗?

我应该如何处理这个?

4

2 回答 2

3

在 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);
于 2012-11-30T11:07:12.023 回答
2

您需要在每个内部字符串周围加上单引号:

string query;
query = "insert or replace into TABLEA (a,b,c) values (@a,'\"@b\"','\"@c\"');";
于 2012-11-29T19:28:05.413 回答