2015-10-17 132 views
0

我有一個SQL table1包含itemcode - itemcount - tablename 和我的窗口form1包含listview1和button1。使用listview項目多SQL表更新

當我點擊button1時,列中的所有listview1 SubItems 1值應該從SubItems [2]中的表名更新,其中itemcode值是SubItems [0]。

我試着下面的代碼,但它應該沒有工作了,因爲它只是做了它必須做的第一行不僅沒有行的其餘部分ListView1的:

foreach (ListViewItem item in listView1.Items) 
{ 
    item.Selected = true; 
} 
if (cn.State == ConnectionState.Closed) cn.Open(); 
cm = new SqlCommand(); 
cm.Connection = cn; 

ListViewItem lvi1 = listView1.SelectedItems[0]; 
string tableName = lvi1.SubItems[2].Text; 
string itemcode1 = lvi1.SubItems[0].Text; 
string itemcode2 = lvi1.SubItems[1].Text; 

string sql = "UPDATE " + tableName + " SET [itemcount]= " + itemcode2 + " WHERE [itemcode]= " + itemcode1 + " AND [itemcount] IS NOT NULL"; 
cm.CommandText = sql; 
cm.ExecuteNonQuery(); 

這裏是截圖:

我的3個表是相同 當用戶點擊按鈕「保存」,它在零下藍色的所有值加亮顯示列在他們的黑色表已經價值凸顯地方itemcode =紅色突出顯示的列如下柱:

listview1 and it's values

1-與代碼1項中testtbl1存在作爲黑色突出顯示列顯示,它的計數是50:

testtbl : itemcode itemcount tablename 
       1   50  testtbl1 

[此處輸入圖像的描述] [3]

2-項與代碼2 testtbl2存在作爲黑色突出顯示列顯示,它的計數是40:

testtbl2 itemcode itemcount tablename 
       2   40  testtbl2 

[此處輸入圖像的描述] [4]

3-現在如在第一相片所示itemcode的計數:1爲15和itemcode:2計數是20

現在當用戶點擊保存按鈕它應該減去藍色每個項目的所述突出ITEMCOUNT從項列中的每個項目表中存在,得到以下結果:

[導致testtbl1] [5]

testtbl itemcode itemcount tablename 
       1   35  testtbl1 

[結果testtbl2] [6]

testtbl2 itemcode itemcount tablename 
       2   20  testtbl2 
+0

這是非常糟糕和錯誤的代碼。 首先,您可以使用sql查詢創建命令。您不能設置commandText參數。 –

+0

謝謝HüseyinBurakKaradag ..你能糾正我的代碼,並告訴我你的意思請 – user5456980

+0

@HüseyinBurakKaradag是的,你可以使用commandtext的參數。 – Crowcoder

回答

0

我仍然發現你的一些問題令人困惑,但我認爲這接近你想要的。我想你想爲每一行都進行更新,但是你只是爲第一個選中的行進行更新。如果你想更新每一行,那麼你根本不需要打擾SelectedRows,只需循環遍歷它們。 你說你想減去計數,但你的查詢沒有這樣做,我把它放在裏面,我希望它是你想要的。 從我讀的,SubItems開始第二列(列表視圖索引1),所以我調整了子項訪問。如果我弄錯了,重新調整。 最後,如果允許用戶在ListView中輸入自由格式的文本,則此代碼會呈現SQL注入危險,因此請確保在插入Update語句中的值之前清理數據。

string sql = "UPDATE {0} SET [itemcount] = [itemcount] - {1} WHERE [itemcode] = {2} AND [itemcount] IS NOT NULL"; 
foreach (ListViewItem item in listView1.Items) 
{ 
    string qry = string.Format(sql, item.SubItems[1].Text, item.SubItems[0].Text, item.Text); 
    using(cm = new SqlCommand(qry, cn)) 
    { 
     cn.Open(); 
     cm.ExecuteNonQuery(); 
     cn.Close(); 
    } 
} 

追問:

要使用參數更改SQL到:

string sql = "UPDATE {0} SET [itemcount] = [itemcount] - @itemcount WHERE [itemcode] = @itemcode AND [itemcount] IS NOT NULL"; 

和SqlParameters添加到命令(SqlDbTypes假設):

SqlParameter par_ItemCount = new SqlParameter("@itemcount", SqlDbType.Int); 
par_ItemCount.Value = int.Parse(item.SubItems[0].Text); 
cm.Parameters.Add(par_ItemCount); 

SqlParameter par_ItemCode = new SqlParameter("@itemcode", SqlDbType.Int); 
par_ItemCode.Value = int.Parse(item.Text); 
cm.Parameters.Add(par_ItemCode); 

然而,你仍然有表名的問題。您不能爲表名稱使用參數。如果有任何可能的方式用戶可以編輯表名,那麼在將其注入到SQL之前必須對其進行驗證。這可以像檢查有效表名稱列表一樣簡單。

+0

感謝您的回覆我只是有一個問題..我應該修改你的代碼來使用參數嗎? – user5456980

+0

@ user5456980檢查編輯 – Crowcoder