從循環中提取所有代碼以構建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