2013-03-15 64 views
3
for (int i = 0; i < purchaseListView.Items.Count; i++) 
Connection con = new Connection(); 
       SqlCommand cmd = new SqlCommand(); 
       SqlCommand cmdFifo = new SqlCommand(); 
       con.OpenConnection(); 
       cmd.Connection = con.DataBaseConnection; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "insertDetail"; 
       cmdFifo.Connection = con.DataBaseConnection; 
       cmdFifo.CommandType = CommandType.StoredProcedure; 
       cmdFifo.CommandText = "insertInToMain"; 

這是我的代碼,我想知道如果循環影響我的軟件的性能,並且這是循環調用存儲過程的正確方法。循環中的存儲過程

我都存儲在一個類的程序,我想在單擊保存按鈕時從表單調用它,並通過同一個存儲過程插入數據庫中的10個項目。

回答

0

您正在爲每個非常低效的項目創建一個新的連接對象。

創建一個連接對象,並使用該產品的詳細信息執行存儲過程n倍。或者,創建一個存儲過程以接受10個項目並在該級別插入數據。

移動此外循環(您可以訪問concmd內環路,而無需創建一個新的實例:

Connection con = new Connection(); 
    SqlCommand cmd = new SqlCommand(); 
    con.OpenConnection(); 
    cmd.Connection = con.DataBaseConnection; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "insertDetail"; 

裏面你的循環,你可以將所有參數添加到cmd對象

cmd.Parameters.Add("@Item", SqlDbType.Int); 
cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; 
cmd.ExecuteNonQuery(); 
+0

可以請你指導我的正確方法嗎?我怎樣才能使它高效? – Bunzitop 2013-03-15 15:27:45

+0

isit efficient to do con.open() for(int i = 0; i Bunzitop 2013-03-15 15:33:15

+0

@ user2174542 - 不是。主要的低效是你處於一個循環中並且創建了大量冗餘對象(即在循環內部使用新的SQLCommand())。您可以重複使用像我在回答中顯示的那樣的對象。 – 2013-03-15 15:36:16

0

那麼,你打開10個連接,似乎你沒有關閉它們,所以你可能會用完連接,但我猜這不是整個代碼,你可以發佈整個代碼嗎?

0

您應該在循環之前設置連接和存儲過程,並只更新循環內的命令參數值和exec。是這樣的:

Connection con = new Connection(); 
SqlCommand cmd = new SqlCommand(); 
SqlCommand cmdFifo = new SqlCommand(); 
con.OpenConnection(); 
cmd.Connection = con.DataBaseConnection; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "insertDetail"; 
cmd.Parameters.Add("@Item", SqlDbType.Int); 
cmdFifo.Connection = con.DataBaseConnection; 
cmdFifo.CommandType = CommandType.StoredProcedure; 
cmdFifo.CommandText = "insertInToMain"; 
//now that your connections & commands are set up, you can reuse them within the loop 
for (int i = 0; i < purchaseListView.Items.Count; i++) 
{ 
    //ToDo:assign any SP parameter values 
    cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; 
    // ... 

    //then exec within the loop 
    cmd.ExecuteNonQuery(); 
    cmdFifo.ExecuteNonQuery(); 
} 
+0

我想保留在一個類中傳遞參數的代碼,並在點擊保存按鈕時調用存儲過程..我只想打開一次連接並調用存儲過程。請你給我一個演示代碼吧! – Bunzitop 2013-03-15 15:31:21

+0

如果您在同一個班級中分配SP參數並運行SP,則最好。它使得OO設計更加原子化。它也有助於避免@jcarlos指出的連接泄漏。 (只要你關閉並妥善處理你的課堂)。 – tgolisch 2013-03-15 15:38:02

+0

如果連接和sqlcommand()a和下面的代碼在一個類的某些功能塊中,我如何才能只打電話 'cmd.Parameters.Add("@Item", SqlDbType.Int); cmd.Parameters["@Item"].Value = purchaseListView.Items[i]; cmd.ExecuteNonQuery();' Bunzitop 2013-03-15 15:54:35

0

我會建議你創建一個表,並通過所有的輸入迭代整個數據插入到它即嘗試創建一個存儲過程。 運行for循環多重編譯時間效率低下,並且由於網絡開銷,數據庫也會生成結果集的次數,這也會影響您的性能。