首页 文章

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

提问于
浏览
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,这可能会解决问题吗?

我该怎么接近这个?

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

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

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

相关问题