web-dev-qa-db-ja.com

データベースへの文字列挿入中に単一引用符がエスケープする

「 '」を使用すると挿入に失敗します。文字列の例:彼は男の子です。エスケープ記号を使用して「 '」をスキップしようとしましたが、これは正しい方法ではないと思います。

textBox3.Text.Replace("'", " \'");
string sql= "insert into gtable (1text,1memo) values ('"+textBox3.Text+"',null)";
        OleDbCommand cmd = new OleDbCommand(sql, con);

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();

「 '」を「 `」に置き換えるオプションがありましたが、これにより、dbのテキストも変更されます。同じように「 '」を保持し、dbにも挿入したいと思います。

26
lunchbox

試してみる

string sql= "insert into gtable (1text, 1memo) " + 
            "values ('" + textBox3.Text.Replace("'", "''") + "', null)";
38
juergen d

これを試して

    string sql= "insert into gtable (1text,1memo) values (@col1,NULL)";
    OleDbCommand cmd = new OleDbCommand(sql, con);
    cmd.Parameters.AddWithValue("@col1",textBox3.Text);
    con.Open();
51
codingbiz

データベースに一重引用符を挿入するには、'''に置き換えます。データベースでは、一重引用符のみが使用されます。

これを使って

string sql= "insert into gtable (1text,1memo) values ('" 
            + textBox3.Text.Replace("'", "''") + "', null)";

残りのコードは同じです。

5
Nikhil Agrawal

String.Replace のMSDN記事には、次のように書かれています。

新しい文字列を返します。現在の文字列内の指定されたUnicode文字または文字列のすべての出現は、指定された別のUnicode文字または文字列に置き換えられます。

最初の行では、textBox3.Textの値をそのメソッド呼び出しの結果に割り当てていないため、まったく何も起こりません。

さらに、SQL Serverで引用符をエスケープするには、2つの単一引用符を使用するだけです(注:二重引用符とは異なります)。

これにより、期待される結果が得られます。

textBox3.Text = textBox3.Text.Replace("'", "''");

さらに、文字列の連結のニーズに合わせて String.Format を調べることもできます。

String escapedInput = textBox3.Text.Replace("'", "''");
String sql = String.Format("insert into gtable (1text,1memo) values ('{0}',null)", escapedInput);
1
Joshua Shearer