【问题标题】:Inserting into two tables C# & SQL Server插入两个表 C# & SQL Server
【发布时间】:2021-08-11 00:31:37
【问题描述】:

我正在尝试开发一个小型 POS 应用程序,我需要向数据库中插入一些数据,但我无法同时插入两个表。

我正在使用这个存储过程:

// insertpurchase stored procedure

BEGIN TRANSACTION
    DECLARE @id int;

    INSERT INTO tblsuppling_general (Supplier, Bill_nr, Date, Total, Note)
    VALUES (@supplier, @billnr, @date, @total, @note)

    SELECT @id = SCOPE_IDENTITY();   // here I want to get ID of the insert of the supply and use on every row in second table

    INSERT INTO tblpurchase_details (ID_of_supplying, Barcode, Name, Category, Stock, VAT, QTY, Unit, Supplying_price, Price, Earn_pcs, Bill_nr)
    VALUES (@id, @barcode, @name, @category, @stock, @vat, 1, @unit, @sup_price, @price, @earn, @billnr)

    COMMIT

还有 C# 代码:

try
{
    conn.Open();

    foreach (DataGridViewRow row in dtgartikulli.Rows)
    {
        if (!row.IsNewRow)
        {
            SqlCommand cmd = new SqlCommand("insertpurchase", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@supplier", cmbsupplier.Text));
            cmd.Parameters.Add(new SqlParameter("@billnr", txtbillnr.Text));
            cmd.Parameters.Add(new SqlParameter("@date", DateTime.Now));
            cmd.Parameters.Add(new SqlParameter("@total", txttotali.Text));
            cmd.Parameters.Add(new SqlParameter("@note", txtnote.Text));
            cmd.Parameters.Add(new SqlParameter("@barcode", row.Cells[0].Value));
            cmd.Parameters.Add(new SqlParameter("@stock", row.Cells[3].Value));
            cmd.Parameters.Add(new SqlParameter("@price", row.Cells[2].Value));
            cmd.Parameters.Add(new SqlParameter("@sup_price", row.Cells[4].Value));
            cmd.Parameters.Add(new SqlParameter("@earn", row.Cells[1].Value));
            cmd.Parameters.Add(new SqlParameter("@fitimi", row.Cells[5].Value));
            cmd.Parameters.Add(new SqlParameter("@category", row.Cells[6].Value));
            cmd.Parameters.Add(new SqlParameter("@unit", row.Cells[9].Value));
            cmd.Parameters.Add(new SqlParameter("@vat", row.Cells[7].Value));

            cmd.ExecuteNonQuery();
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show("Insertion of transaction failed" + ex.ToString());
}
finally
{
    foreach (DataGridViewRow row in dtgartikulli.Rows)
    {
        if (!row.IsNewRow)
        {
            SqlCommand cmd = new SqlCommand("insertproducts", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@barcode", row.Cells[0].Value));
            cmd.Parameters.Add(new SqlParameter("@stock", row.Cells[3].Value));
            cmd.Parameters.Add(new SqlParameter("@price", row.Cells[2].Value));
            cmd.Parameters.Add(new SqlParameter("@sup_price", row.Cells[4].Value));
            cmd.Parameters.Add(new SqlParameter("@earn", row.Cells[1].Value));
            cmd.Parameters.Add(new SqlParameter("@fitimi", row.Cells[5].Value));
            cmd.Parameters.Add(new SqlParameter("@category", row.Cells[6].Value));
            cmd.Parameters.Add(new SqlParameter("@unit", row.Cells[9].Value));
            cmd.Parameters.Add(new SqlParameter("@vat", row.Cells[7].Value));

            cmd.ExecuteNonQuery();
        }
    }

    conn.Close();
    fshi();

    MessageBox.Show("Transaction is saved successfully");
}

插入已完成,但我希望它以一对多的关系进行。例如在表一中只有一行包含账单的一般信息,而在第二个表中是账单的详细信息(产品信息)。使用上面的代码,我在表一中的行数与表二中的行数一样多。例如,如果我在表 2 中有四行包含产品信息,我会在表中的四行中获得相同的重复数据,其中包含采购账单的一般数据,而不是只有一行。我的问题是怎么做,以实现一对多插入(购买表的一般信息一行)和(购买产品信息表的多行)

提前致谢

【问题讨论】:

  • 如果我正确理解您的问题,您希望插入 1 个tblsuppling_general 记录和多个tblpurchase_details。就我个人而言,我会使用单个 SP 并使用 table valued parameter 传递详细信息,以便您可以传递任意数量的信息。
  • 我支持TVP,它非常有效。请参阅here 了解如何将其传递给您的过程。顺便说一句,您应该使用using 处理您的连接和命令对象,明确指定参数类型和长度/比例,并且在连接打开时不应使用消息框阻塞线程

标签: c# sql-server insert


【解决方案1】:

您可以将程序一分为二,一个用于tblsuppling_general,另一个用于tblpurchase_details

或者您可以将当前程序更改为:

IF NOT EXISTS (
    SELECT 1 FROM tblsuppling_general WHERE 
)
    BEGIN
        INSERT INTO tblsuppling_general (Supplier, Bill_nr, Date, Total, Note)
        VALUES (@supplier, @billnr, @date, @total, @note)
    END

etc...

但请注意,这种insert-if-not-exists 在重负载下会出现问题,因为IF NOT EXISTSINSERT INTO 的执行不是原子的。

我个人建议使用两个程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多