2017-12-14 12 views
0

コメントしたものを見ると、ユーザー入力を直接クエリに追加することで簡単に動作させることができますが、パラメータ化しようとすると値のSqlCommmandパラメータがUPDATEステートメント(C#、MVC)に追加されない

は、このコードは

は、テーブル変数@formTable

定義しなければならないエラーを投げているが、問題は、値のいずれも追加されていないです...パラメータに追加されています、テーブル変数だけでなく、テーブル名変数に静的テキストを配置する)。

このプロジェクトでは、完全に機能するような構造のinsert文がたくさんあります。私はここで間違って何をしていますか?

string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

using (SqlConnection con = new SqlConnection(constr)) 
{ 
    //string query = "UPDATE " + s.formTable + " SET " + s.column + " = '" + s.cellValue + "' WHERE MasterID = '" + s.id + "'"; 
    string query = "UPDATE @formTable SET @column = @cellValue WHERE MasterID = @id;"; 

    using (SqlCommand cmd = new SqlCommand(query)) 
    { 
     //SqlParameter param = new SqlParameter("@formTable", s.formTable); 
     //cmd.Parameters.Add(param); 
     cmd.Parameters.AddWithValue("@formTable", s.formTable); 
     cmd.Parameters.AddWithValue("@column", s.column); 
     cmd.Parameters.AddWithValue("@cellValue", s.cellValue.ToString()); 
     cmd.Parameters.AddWithValue("@id", s.id.ToString()); 

     cmd.Connection = con; 

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

答えて

1

パラメータ値のために、識別子(テーブル、列など)をオブジェクトではありませんので、あなたが持っている唯一の有効なパラメータは@cellValue@idです。

ユーザーの入力に基づいてテーブル/列の名前を動的に設定する場合は、文字列の連結を検討する可能性があります。 しかし、は、必ずしもSQLインジェクションを意味しません。既知の値のセットに対してユーザー入力を検証し、連結で既知の値を使用するだけです。

たとえば、すべてのテーブル名を持つList<string>があるとします。テーブルが決して変更されない場合は、ハードコードされているか、データベース内のquerying some system/schema tablesによってテーブルを動的に変更することができます。

ユーザーがテーブル名の値を入力するときに、テーブル名がリストにあるかどうかを確認します。一致する場合は、リストから一致する値を使用します。そうでない場合は、エラー状態を処理します(ユーザーにメッセージを表示するなど)。したがって、文字列の連結を使用していても、実際のユーザー入力は文字列に入力されません。 という良い値が連結されているだけです。は、あなたが現在持っている文字列リテラルと変わりません。

関連する問題