3

C# と SQL Server 2008 で管理プログラムを作成しています。一度に血液型、地区、クラブ名を使用してレコードを検索したいと考えています。これが問題を引き起こしているものです:

    SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM Table2 
    WHERE @Blood_Group =" + tsblood.Text + "AND @District =" + tsdist.Text + 
    "AND  Club_Name =" + tscname.Text, Mycon1);

誰でも正しい構文を教えてもらえますか? 事前にTnx。:)

4

2 に答える 2

7

正しい構文は、パラメーター化されたクエリを使用し、SQL クエリを作成するときに文字列連結を絶対に使用しないことです。

string query = "SELECT * FROM Table2 WHERE BloodGroup = @BloodGroup AND District = @District AND Club_Name = @ClubName";
using (SqlDataAdapter sda = new SqlDataAdapter(query, Mycon1))
{
    sda.SelectCommand.Parameters.AddWithValue("@BloodGroup", tsblood.Text);
    sda.SelectCommand.Parameters.AddWithValue("@District", tsdist.Text);
    sda.SelectCommand.Parameters.AddWithValue("@ClubName", tscname.Text);
    ...
}

これにより、パラメーターが適切にエンコードされ、コードが SQL インジェクション攻撃に対して脆弱になりません。チェックアウトbobby tables

また、SqlDataAdapter などの IDisposable リソースを using ステートメントにラップして、例外が発生した場合でも適切に破棄され、プログラムがアンマネージ ハンドルをリークしないようにする方法にも注意してください。

于 2013-02-24T16:20:28.130 に答える
1

を忘れましたAND(および可能性があります の@前にClub_Name?):

String CRLF = "\r\n";

String sql = String.Format(
      "SELECT * FROM Table2" + CRLF+
      "WHERE @Blood_Group = {0}" + CRLF+
      "AND @District = {1} " + CRLF+
      "AND Club_Name = {2}", 
      SqlUtils.QuotedStr(tsblood.Text), 
      SqlUtils.QuotedStr(tsdist.Text),
      SqlUtils.QuotedStr(tscname.Text));

SqlDataAdapter sda = new SqlDataAdapter(sql, Mycon1);
于 2013-02-24T17:01:22.333 に答える