Linq to SQL插入存储过程排除插入

时间:2016-05-15 17:55:35

标签: c# sql-server winforms linq datagridview

我在SQL Server中有一个存储过程负责将记录插入数据库:

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 to 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!");
    }
}

2 个答案:

答案 0 :(得分:0)

而不是

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

使用

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

这样你也得到了最后一行。

答案 1 :(得分:0)

您的循环终止已开启:

i < dataGridView1.Rows.Count - 1;

这将始终比数据网格中的行数少一个。

只需将其替换为:

i < dataGridView1.Rows.Count;

同样正如Adrian Iftode在comment中指出的那样,你不需要在循环的每次迭代中重新创建上下文,而你也不需要调用SubmitChanges作为你的存储过程将数据直接写回数据库。