【发布时间】: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