2017-09-13 17 views
0

に私はこれまでのところ、私はこれを持って、私のクエリで私のリストを使用します。しかし、それは動作しません。一覧<string>は、C#

foreach(string area in penalties) 
{ 
    string query = "SELECT * FROM tblpenalty WHERE Area='" + area + "';"; 
    using (connection) 
    { 
     using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, connection)) 
     { 
     DataSet ds = new DataSet(); 
     adapter.Fill(ds); 
     dataGridView1.DataSource = ds.Tables[0]; 
     dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders); 
     } 
    } 
} 
+0

例外はありますか? –

+0

番号。エラーはありません。それは空のdatagridview @AkashKC –

+0

あなたのクエリが適切な結果を返していないようです。再度クエリ文字列の連結を避け、代わりにパラメータを使用します。 –

答えて

0

あなたのコードを見ると、指定されたペナルティリストに属するデータグリッドのペナルティを入力したいと強く信じています。これが必須の場合は、INクエリを使用できます。

List<string> penalties = new List<string>(); 
string joinedPenalty = String.Join(",", penalties); 
string query = "SELECT * FROM tblpenalty WHERE Area IN (" + joinedPenalty + ");"; 
using (connection) 
{ 
    using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, connection)) 
    { 
     DataSet ds = new DataSet(); 
     adapter.Fill(ds); 
     dataGridView1.DataSource = ds.Tables[0]; 
     dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders); 
     } 
    } 
} 

値の生のクエリを渡し、あなたはそれがSQLインジェクションを防ぐようパラメータ化クエリで値を渡す必要があります。

次のコードは、ペナルティの与えられたリストから、所属するすべてのペナルティを移入します。パラメータ化されたINクエリを使用するには、次のような参照を取ることができますexample

SQLインジェクションを防ぐために、パラメータ化クエリのアプローチ:

var penalties = new List<string>(); 
var parameters = new string[penalties.Count]; 
var cmd = new SqlCommand(); 
for (int i = 0; i < penalties.Count; i++) 
{ 
    parameters[i] = $"@Area{i}"; 
    cmd.Parameters.AddWithValue(parameters[i], penalties[i]); 
} 
string query = $"SELECT * FROM tblpenalty WHERE Area IN ({string.Join(", ", parameters)});"; 
using (connection) 
{ 
    using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, connection)) 
    { 
     DataSet ds = new DataSet(); 
     adapter.Fill(ds); 
     dataGridView1.DataSource = ds.Tables[0]; 
     dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders); 
    } 
} 
+4

これは脆弱ですSQLインジェクション攻撃。 –

+0

@JoelCoehoorn:SQLインジェクションについてのコメントをありがとう。私は私の答えを更新しました。私はちょうど簡単な方法でOPの要件に近づくことについてのアイデアを与えるために私の答えを掲載したので、SQLインジェクションのものを逃した。 –

+0

あなたのコードを脆弱ではないと言い足りるまであなたのコードを修正するまで下降してしまいました。私はうまくいきません。ここには適切なやり方へのリンクがあります。 –

1

これは私がMySqlDataParameter.SelectCommand使用方法の助けを借りて、IN句を使用してList<string>ためのパラメータ化クエリを構築するためにthis solution & this solutionからしようとしたものです:

string query = "SELECT * FROM tblpenalty WHERE Area IN ({0})"; 
string[] penaltiesArray = penalties.ToArray(); // list converted to array as in /a/6804883/ 
string[] parameters = penalties.Select((x, n) => "@area" + n.ToString()).ToArray(); 
query = string.Format(query, string.Join(",", parameters)); 
using (connection) 
{ 
    using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, connection)) 
    { 
     // iterate through the list & set parameters to data adapter 
     for (int i = 0; i < parameters.Length; i++) 
     { 
      // use MySqlDataParameter.SelectCommand directly without additional MySqlCommand 
      // and use MySqlDbType depending on data type used in target column 
      adapter.SelectCommand.Parameters.Add(parameters[i], MySqlDbType.VarChar).Value = penaltiesArray[i]; 
     } 
     DataSet ds = new DataSet(); 
     adapter.Fill(ds); 
     dataGridView1.DataSource = ds.Tables[0]; 
     dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders); 
    } 
} 

例のクエリは&の結果がに挿入されることに注意してください0 foreachループのため繰り返し、適切な結果が得られませんでした。 IN句を使用して複数の値を保持する方がはるかに望ましい解決策です。