2017-09-13 19 views
0

我想用我的查询我的名单,到目前为止,我有这样的:列表<string>查询在mysql C#

public List<string> penalties = new List<string>(); 
while (myReader.Read()) 
{ 
    penalties.Add((myReader["Area"].ToString())); 
} 

这是填充我的datagridview。但它不起作用。

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

downvoted,直到你修复你的代码不易受攻击,不够好说,我的是不安全的,这是一个链接到正确的方式 –

1

这是我从this solution & this solution试图建立一个List<string>参数化查询使用IN条款,与MySqlDataParameter.SelectCommand用法的帮助:

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); 
    } 
} 

请注意,您的示例查询将执行&结果插入到DataGridView反复由于foreach循环,所以你没有得到正确的结果。使用IN子句来保存多个值是更优选的解决方案。