2

単一の値を SQL データベースに挿入しようとしています。「\」を挿入しない限り、正常に機能します。その場合、データベース内の「\」が失われます。

たとえば、デバッガーには次のコマンド テキストが表示されます。

Insert into tblProjekte (Projektbezeichnung) values ('\\bla\\bla\\bla')

しかし、SQL Server Profiler では、常に次の Insert ステートメントを見つけます。

Insert into tblProjekte (Projektbezeichnung) values ('\bla\bla\bla')

私のソースコード:

public void InsertProjekt(string Projektbezeichnung)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "Server=localhost; Database=myProjekt; UID=user; PWD=pwd";
    con.Open();

    SqlCommand com = new SqlCommand();
    com.Connection = con;
    com.CommandText = String.Format("Insert into tblProjekte (Projektbezeichnung) values ('{0}')",@Projektbezeichnung);
    int rows = com.ExecuteNonQuery();        
}

ソースコードを次のように変更した後:

SqlCommand com = new SqlCommand("INSERT INTO tblProjekte (Projektbezeichnung) VALUES (@Projektbezeichnung)");
            com.Parameters.AddWithValue("@Projektbezeichnung", Projekt.Projektbezeichnung);

デバッグ中に次の情報を取得します。 ここに画像の説明を入力

値は「\\Tesafilm」、SQLValue は「\Tesafilm」です。

4

2 に答える 2

3

代わりにパラメータ化されたクエリを使用します。

public void InsertProjekt(string Projektbezeichnung)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "Server=localhost; Database=myProjekt; UID=user; PWD=pwd";
    con.Open();

    SqlCommand com = new SqlCommand();
    com.Connection = con;
    com.CommandText = "Insert into tblProjekte (Projektbezeichnung) values (@value)"
    com.Parameters.AddWithValue("@value", Projektbezeichnung);

    int rows = com.ExecuteNonQuery();

}

于 2013-07-31T11:42:44.847 に答える
3

いくつかのコメントが指摘しているように、この\文字は SQL の「エスケープ文字」です。適切にエスケープされた文字列を使用せずに挿入すると、SQL はそれらを単なるエスケープ文字として解釈するため、それらを取り除きます。

パラメータ化されたクエリをシミュレートするために使用string.Format()していますが、それは実際にはうまくいきません。ただし、を使用するSqlCommand.Parameters.AddWithValue()と、問題が解決するはずです。

SqlCommand com = new SqlCommand("INSERT INTO tblProjekte (Projektbezeichnung) VALUES (@Projektbezeichnung)");
com.Parameters.AddWithValue("@Projektbezeichnung", Projektbezeichnung);
com.Connection = con;
int rows = com.ExecuteNonQuery();

SqlCommand.Parametersコレクションの詳細については、 MSDN のこちらを参照してください。さまざまなシナリオにより適したいくつかの「追加」メソッドを提供しますが.AddWithValue()、この場合は通常の方法で問題なく動作するはずです。

更新: MSDN の状態が支持されて非推奨になったため、オリジナル.Add()を に変更しました。.AddWithValue()SqlParameterCollection.Add().AddWithValue()

于 2013-07-31T11:43:28.193 に答える