【问题标题】:Cant seem to escape a query i am sending to my sqlite3 db, not sure why似乎无法逃避我发送到我的 sqlite3 数据库的查询,不知道为什么
【发布时间】:2012-11-29 19:17:13
【问题描述】:

我有一个这样的字符串:

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

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

【问题讨论】:

  • stackoverflow.com/questions/603572/… 有助于理解我应该删除我拥有的“,只是拥有 ',然后在输入字符串中搜索 ' 并插入一个额外的,这样 DB 语言将了解 '' 是 1 个引号

标签: c++ sql sqlite prepared-statement


【解决方案1】:

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

【讨论】:

  • 谢谢 CL,帮了大忙
【解决方案2】:

每个内部字符串都需要单引号:

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

【讨论】:

  • 它必须围绕整个内部字符串吗?还是可以像......'\"@b\"','\"@c\"');"; 围绕单个组件?
  • 你在想什么?我不确定我是否应该用单引号代替双引号。
  • 我试图把它包裹在整个东西上,它会调用一个错误,说 3 列的 2 个条目或诸如此类的东西,所以它会将整个单引号字符串识别为 1 个条目。此外,字符串可以有一个单引号,当我测试它时,它会在 \' 上出错,因为它仍然将 ' 识别为字符串的结尾。
  • @Fallenreaper,我最初的输入是错误的。您需要在每个字符串周围加上单引号。 CL 有我想要传达的内容,只是写得更好。
  • 是的,我按照你的方法试过了,我说“那不对。”所以,我意识到,当我在这些东西周围做 \" 时,我实际上应该只是在做单引号。现在它被你修改了,我给你 +1
猜你喜欢
  • 2010-09-05
  • 2020-11-10
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2012-11-02
相关资源
最近更新 更多