2014-09-03 26 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

相關問題