5

そのため、SQL インジェクションなどのセキュリティの問題を回避するには、パラメータ化されたクエリを絶対に使用する必要があることを最近知りました。それはすべて問題ありません。私はそれを機能させました。

このコードは、私がそれを行う方法の一部を示しています。

param1 = new SqlParameter();
param1.ParameterName = "@username";
param1.Value = username.Text;
cmd = new SqlCommand(str, sqlConn);
cmd.Parameters.Add(param1);

//and so on

しかし問題は、データベースに保存する必要がある変数が 14 個以上あることです。これは登録フォームのようなものです。そして、これらの行を 14 回も記述して各変数をパラメータ化する必要があるとしたら、非常に面倒に見えます。これを行うより動的な方法はありますか?for ループなどを使用して、ループ内のすべての変数を何らかの方法でパラメータ化するようなものですか?

4

6 に答える 6

7

単一行のSqlParameterCollection.AddWithValueメソッドを使用する

cmd.Parameters.AddWithValue("@username",username.Text);
于 2012-11-28T07:45:36.980 に答える
2

どうぞ... dapper経由で:

connextion.Execute(sql, new {
    username = username.Text,
    id = 123, // theses are all invented, obviously
    foo = "abc",
    when = DateTime.UtcNow
});

これは にマップされますExecuteNonQueryが、(行ごとQuery<T>にデータを名前で非常に効率的にタイプのオブジェクトにバインドする)、 ( と同様ですが、 を使用する)、その他いくつかの方法 (複数のグリッドまたは複数のオブジェクトをバインドするなど) などの方法があります。すべてが可能な限り高速になるように最適化されています (IL レベルのメタプログラミング)。TQueryQuery<T>dynamic

于 2012-11-28T07:51:26.910 に答える
2

または、このように試すことができる他のバリエーション

command.Parameters.Add(new SqlParameter("Name", dogName));
于 2012-11-28T07:48:01.737 に答える
1

別のテクニック、使用できます..

List<SqlParameter> lstPrm = new List<SqlParameter>();

 lstPrm.Add(new SqlParameter("@pusername", usernameValue ));
 lstPrm.Add(new SqlParameter("@pID", someidValue));
 lstPrm.Add(new SqlParameter("@pPassword", passwordValue));

パラメータを挿入するために反復できる最後を追加しますcommand object

于 2012-11-28T07:53:02.680 に答える
0

さらに良いことに、ピカピカの新しい Visual Studio extensionを使用してください。パラメータをSQLで宣言し、独自のファイルでそのままにします。私の拡張機能は、ファイルを保存するときにクエリを実行し、実行時に呼び出すラッパー クラスと、結果にアクセスするための結果クラスを作成し、あらゆる場所でインテリセンスを使用します。ラッパー クラスの Execute() メソッドへの引数として、SQL パラメータが表示されます。C# のパラメーター コード、リーダー コード、cmd、さらには接続 (自分で管理したくない場合を除く) の別の行を記述する必要はありません。行ってしまった:-)

于 2016-04-12T07:24:24.647 に答える