5

私が抱えている問題を推測できると思います。C++ Builder で sql データベースにファイル名を挿入しています。一部のファイルには、名前にアポストロフィが含まれています。これにより、SQL 挿入クエリが壊れます。これを修正する通常の方法は、フィールド値の一部にしたいアポストロフィを 2 倍にすることです。

たとえば、'george's' をフィールド 'owner' に追加したい場合、SQL クエリは「insert into table (owner) values ('george''s')」になります。

私はそのビットで大丈夫です。単一のアポストロフィを二重のアポストロフィに置き換えるだけです。AnsiString には、このための組み込み関数がないようです。まったく新しいヘッダー ファイルをインクルードせずにそれを行う簡単な方法はありますか?

4

5 に答える 5

6

実は私は自分で答えを得ました...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(つまり、AnsiStringには組み込みのreplace関数があります)

編集:異なる引用符を区別できるようにコードタグを追加しました

于 2009-01-21T01:32:21.070 に答える
1

私はAnsiStringを使用していませんが、基本的に次のようにします。

  • 文字列内の一重引用符を逆検索します
  • 現在の一重引用符インデックスの左右を見てください
  • まだ一重引用符がない場合は、現在のインデックスの後に一重引用符を挿入します
  • インデックス0に達するまでループを続けます。
于 2009-01-21T01:32:13.410 に答える
0

これを行う通常の方法は、独自のSQLを生成するのではなく、プリペアドステートメントを使用することです。これが悪い理由の1つとして、SQLインジェクションを調べてください。基本的に、アプリのどこかにある場合、SQLステートメントの引用符を2倍にするのを忘れ、攻撃者が何らかの方法でそのSQLステートメントに値を送信すると、データベースがハッキングされます。(起こり得ることのユーモラスな例については、このxkcdコミックを参照してください。)

于 2009-01-21T01:33:41.193 に答える
0

そのように置き換えるとどうなりますか

item = StringReplace( item, "'", "\'", TReplaceFlags() );
于 2009-01-21T07:55:16.337 に答える