2016-05-15 51 views
0

第一排我在SQL Server中負責將記錄到數據庫中的存儲過程:LINQ到SQL插入存儲過程排除將

ALTER proc [dbo].[Sp_Add_Item_Decription] 
    @orderid int, 
    @itemid int, 
    @qty decimal(18, 2), 
    @price decimal(18, 2) 
as 
    insert into [ResturantDB].[dbo].[ItemDescribtion] ([OrderID], [ItemID],[Qty], [Price]) 
    values (@orderid, @itemid, @qty, @price) 

我使用LINQ到SQL生成下面的代碼,但是當我執行此代碼,如果datagridview包含一行而不是插入到數據庫中,但是如果datagridview包含多個記錄,則除第一行外,將插入所有記錄。我不知道是什麼問題。我需要插入所有的datagridview記錄。

private void Button3_Click(object sender, EventArgs e) 
{ 
    dataGridView1.DataSource = DTL; 

    if (!string.IsNullOrEmpty(textBox1.Text) && !string.IsNullOrEmpty(textBox3.Text)) 
    { 
     for(int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 
      resturantDataContext addorderdes = new resturantDataContext(); 
      addorderdes.Sp_Add_Item_Decription(Convert.ToInt32(textBox1.Text), 
           Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value), 
           Convert.ToDecimal(dataGridView1.Rows[i].Cells[3].Value), 
           Convert.ToDecimal(dataGridView1.Rows[i].Cells[4].Value)); 
      addorderdes.SubmitChanges(); 
     } 

     RadMessageBox.Show("RECORD ADDED!"); 
    } 
} 
+1

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

也許你應該在詢問我們之前考慮調試你的應用程序...... –

+2

另外當你只使用上下文來調用存儲過程時,不需要提交ChangeChanges。您不需要每次都創建上下文,只需將外部環境移至for循環即可 –

回答

0

而不是

for(int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 

使用

for(int i = 0; i < dataGridView1.Rows.Count; i++) 
     { 

這樣你得到的最後一排了。

0

你的循環終止是:

i < dataGridView1.Rows.Count - 1; 

這總比在數據網格中的行數少一個。

只需將其替換爲:

i < dataGridView1.Rows.Count; 

而且阿德里安Iftode在指出他comment你不需要重新對循環的每個迭代的情況下,你不需要調用SubmitChanges爲您的存儲過程直接將數據寫回數據庫。