从循环中提取所有代码以构建MySqlCommand
并初始化两个参数,第一个参数始终具有相同的值,而第二个参数不同。因此,在循环内检查listview子项目中的空值,如果不为空,则设置第二个参数的值。现在你可以执行它,后面的循环只需要改变第二个参数的值。
string query = "insert into results(sid,c_id)values(@id, @cid))";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = _stuid;
cmd.Parameters.Add("@cid", MySqlDbType.Int32);
conn.Open();
for (int cnt = 0; cnt < lv1.Items.Count; cnt++)
{
string subItem = lv1.Items[cnt].SubItems[2].Text;
if(!string.IsNullOrWhiteSpace(subItem))
{
cmd.Parameters["@cid"].Value = Convert.ToInt32(subItem);
cmd.ExecuteNonQuery();
}
}
conn.Close();
以这种方式,您只需打开一次连接,然后在执行循环前准备好命令。该命令使用参数化查询,因此从Sql Injection安全。
另请参阅如何不使用引号和字符串连接的sql字符串更具可读性。
最后说明:
我假设c_id
字段是一个数字字段。
我已将for ...循环更改为更简单的形式。
这种类型的代码导致使用一个事务来保持一切都是原子的(意思是说,如果一个插入失败,所有的东西都应该回滚,而不需要对数据库进行任何修改)。欲了解更多信息,请看this question
[给我参数化的SQL,或给我死亡](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/) – 2014-09-03 15:18:14
使用如果条件与'continue'关键字一起例如 'if(lv1.Items [cnt] == string.Empty)continue;' – MethodMan 2014-09-03 15:18:49
此查询被暴露给注入。 – phadaphunk 2014-09-03 15:18:56