如何为两个不同的表编写textbox和datagridview值的插入查询?

时间:2014-04-16 08:37:42

标签: c# sql winforms datagridview textbox

我在winform应用程序中使用文本框和数据网格视图。用户输入的文本框值和数据网格视图值应保存在两个不同的SQL表中,表示所有文本框条目保存在一个表中,所有datagridview条目保存在另一个表中。

我该怎么做?

以下是我的存储过程和表格PurchasePurchasedetail

CREATE PROC sp_insert_pdtl (
    @purchase_id varchar(15),
    @purchase_date date,
    @ref_no int,
    @product_id int,
    @product_name nvarchar(50),
    @qty int,
    @price float,
    @tax int,
    @discount int,
    @total int
) AS 

begin transaction

INSERT INTO Purchase(purchase_id, purchase_date, ref_no)
VALUES(@purchase_id, @purchase_date, @ref_no)
INSERT INTO Purchasedetail(product_id, product_name, qty, price, tax, discount, total)
VALUES (@product_id, @product_name, @qty, @price, @tax, @discount, @total)
commit`enter code here`

这是我的C#代码。但是,当我执行它时,它不会将数据保存在两个表中。

private void SAVE(object sender, EventArgs e)
{
    try
    {
        con.Open();
        using (SqlTransaction transaction = con.BeginTransaction())
        {
            auto();
            cmd = new SqlCommand("sp_insert_pdtl", con,transaction);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@purchase_id", textid.Text);
            cmd.Parameters.AddWithValue("@purchase_date", dateTimePicker1.Value);
            cmd.Parameters.AddWithValue("@ref_no", textrno.Text);
            for (int i = 0; i < datagrid.Rows.Count; i++)
            {
                cmd.Parameters.AddWithValue("@product_id", datagrid.Rows[i].Cells["product_id"].FormattedValue);
                cmd.Parameters.AddWithValue("@product_name", datagrid.Rows[i].Cells["product_name"].FormattedValue);
                cmd.Parameters.AddWithValue("@qty", datagrid.Rows[i].Cells["qty"].FormattedValue);
                cmd.Parameters.AddWithValue("@price", datagrid.Rows[i].Cells["price"].FormattedValue);
                cmd.Parameters.AddWithValue("@tax", datagrid.Rows[i].Cells["tax"].FormattedValue);
                cmd.Parameters.AddWithValue("@discount", datagrid.Rows[i].Cells["discount"].FormattedValue);
                cmd.Parameters.AddWithValue("@total", datagrid.Rows[i].Cells["total"].FormattedValue);
            }
            cmd.ExecuteNonQuery();
            transaction.Commit();
        }                        
        MessageBox.Show("Added Sucessfully", "OUTPUT", MessageBoxButtons.OK, MessageBoxIcon.Information);                           
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.Message);
    } 

1 个答案:

答案 0 :(得分:0)

在这里,您尝试插入一个主记录和多个子记录,这不能按照您实现的方式完成。它只会选择for循环返回的最后一个子记录,所有其他子记录都将被忽略。

我认为您应该将所有子记录作为XMLADO.NET表值参数传递给SP,并在SP中解析这些记录并在主记录之后插入。

对于表值ADO.NET参数,请检查以下链接。

Pass table valued parameter using ADO.Net

还有一个建议,如果你在代码中使用截断,那么你不需要在SP级别。