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()を使用してすべてを実行しています。他にやるべきことはありますか?プリペアドステートメントは、私がやろうとしていることを処理しますか?

prepare_v2で試してみれば、問題が解決する可能性がありますか?

これにどのようにアプローチする必要がありますか?

4

2 に答える 2

3

SQLでは、文字列は一重引用符を使用し、2つの一重引用符を使用してエスケープされます。(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 に答える