2014-09-03 66 views
0

这是我的代码保存到MySQL数据库的列表视图项目在C#...我怎么能跳过列表视图行,如果它没有插入数据呢?我有点失去了我要插入If语句的位置..请任何人吗?如何在保存到数据库时跳过列表视图行?

for (int cnt = 0; cnt <= lv1.Items.Count - 1; cnt++) 
{ 
    string query = "insert into results(sid,c_id)values('" + _studid + "','" + lv1.Items[cnt].SubItems[2].Text + "')"; 

    conn.Open(); 
    MySqlCommand cmd = new MySqlCommand(query, conn); 
    cmd.ExecuteNonQuery(); 
    conn.Close(); 


} 
+6

[给我参数化的SQL,或给我死亡](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/) – 2014-09-03 15:18:14

+0

使用如果条件与'continue'关键字一起例如 'if(lv1.Items [cnt] == string.Empty)continue;' – MethodMan 2014-09-03 15:18:49

+2

此查询被暴露给注入。 – phadaphunk 2014-09-03 15:18:56

回答

2

从循环中提取所有代码以构建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

+0

ohh ..所以这是参数化的SQL,感谢这一点。 – 2014-09-03 15:48:22

+0

是的,你可以为你的值放置一个占位符,而不是连接字符串中的值(Sql注入,解析包含单引号的字符串的问题,解析日期格式,小数点分隔符等等),准备一个带有类型,大小,精度要求,并让数据库代码找出如何正确使用所有这些信息 – Steve 2014-09-03 15:53:34

0

此代码跳过插入到数据库中,如果没有数据添加,现在查询使用参数: 你可以打开和关闭连接以外的连接,它肯定会提高性能

conn.Open(); 
for (int cnt = 0; cnt <= lv1.Items.Count - 1; cnt++) 
{ 
    if(lv1.Items[cnt].SubItems[2].Text=="") 
     continue; 
MySqlCommand m = new MySqlCommand(readCommand); 
m.Parameters.Add(new MySqlParameter("@id", _studid)); 
m.Parameters.Add(new MySqlParameter("@val", lv1.Items[cnt].SubItems[2].Text)); 

    string query = "insert into results(sid,c_id)values(@id, @val)"; 

    MySqlCommand cmd = new MySqlCommand(query, conn); 
    cmd.ExecuteNonQuery(); 
} 
conn.Close(); 
+0

将查询更改为参数化,而不是答案将工作 – MethodMan 2014-09-03 15:21:02

+0

这只是从给定的例子复制和粘贴,但我同意它是完全不安全的 – cinek 2014-09-03 15:21:51

+2

海事组织的答案应该解决这个问题。如果没有代码,至少教育OP关于漏洞的知识?它不会受伤。 – 2014-09-03 15:23:59

相关问题