1

以前の開発者コードを変更していて、更新ステートメントでパラメーターを使用していないことがわかりました。インジェクションに対してより安全にするためにパラメーターを使用して変更しましたが、今ではまったく更新されません。古いコードで更新されました。コードは問題なく実行されます。エラーは発生しませんが、テーブルは更新されません。値が次のように表示されている場合

csharpa="Hello"
csharpb="Text"
csharpc="1"

デバッグ中。テーブルのチェック

select * from table where sqlb="Text" and sqlc="1" 

まだ以前の値を持っています

sqla="Goodbye" 

期待どおりに Hello に更新されませんでした。

前のコード:

string q = "update table set sqla='" + 
    csharpa + "' where sqlb='" + csharpb + 
    "' and sqlc=" + (string)HttpContext.Current.Session["csharpc"];
SqlConnection conn = new SqlConnection(connstr);
SqlCommand sda = new SqlCommand(q, conn);
conn.Open();
sda.ExecuteNonQuery();
conn.Close();

後のコード:

string q = "update table set sqla='@para' where sqlb='@parb' and sqlc=@parc";
SqlConnection conn = new SqlConnection(connstr);
SqlCommand sda = new SqlCommand(q, conn);
sda.Parameters.AddWithValue("@para", csharpa);
sda.Parameters.AddWithValue("@parb", csharpb);
sda.Parameters.AddWithValue("@parc", (string)HttpContext.Current.Session["csharpc"]);
4

2 に答える 2

3

引用符を削除します。

string q = "update table set sqla=@para where sqlb=@parb and sqlc=@parc";

DB はフィールドが文字列かどうかを自動的に認識するため、引用符で囲む必要はありません。

于 2013-12-17T19:51:11.533 に答える
2

パラメータ化されたステートメントに一重引用符は必要ありません。

この行を変更します。

string q = "update table set sqla='@para' where sqlb='@parb' and sqlc=@parc";

これに:

string q = "update table set sqla=@para where sqlb=@parb and sqlc=@parc";

呼び出しsda.Parameters.AddWithValueは、値が文字列であると評価し、パラメーターを一重引用符で囲むことなく正しく渡します。

于 2013-12-17T19:53:08.527 に答える