C# 用于插入带有事务的三条sql语句的存储过程
我有一张发票,它存储在两个表中,第一个表包含发票的一般信息,如发票号、日期等。。第二个表包含发票中购买的项目的详细信息,如项目名称、数量等…C# 用于插入带有事务的三条sql语句的存储过程,c#,sql-server,winforms,stored-procedures,transactions,C#,Sql Server,Winforms,Stored Procedures,Transactions,我有一张发票,它存储在两个表中,第一个表包含发票的一般信息,如发票号、日期等。。第二个表包含发票中购买的项目的详细信息,如项目名称、数量等… 我想创建一个存储过程,首先插入发票的常规信息,然后遍历将在datagridview行中的发票项,将它们逐个插入发票详细信息表中。在每次详细信息插入中,库存中的项目数量都会更新,因此这使我的存储过程处理3sql查询。 我已经编写了一个存储过程,但是我陷入了在存储过程中编写loop语句的过程中。。有人能帮忙吗 Create proc [dbo].[AddNew
我想创建一个存储过程,首先插入发票的常规信息,然后遍历将在datagridview行中的发票项,将它们逐个插入发票详细信息表中。在每次详细信息插入中,库存中的项目数量都会更新,因此这使我的存储过程处理3sql查询。
我已经编写了一个存储过程,但是我陷入了在存储过程中编写loop语句的过程中。。有人能帮忙吗
Create proc [dbo].[AddNewSellDetails]
@invoiceNo int,
@invoice_date date,
@SELL_ID int,
@PRO_ID int,
@QUANTITY varchar(10),
@UNIT nvarchar(15),
@PRICE varchar(20),
@AMOUNT varchar(20),
@DISCOUNT varchar(20),
@FINAL_TOT varchar(30)
as
begin transaction
begin try
INSERT INTO Sell
(ID,sellDate) values (@invoiceNo,@invoice_date)
INSERT INTO Sell_Details
(Sell_ID
,Product_ID
,Quantity
,Unit
,Price
,Amount
,Discount
,Final_Tot)
VALUES
(@SELL_ID
,@PRO_ID
,@QUANTITY
,@UNIT
,@PRICE
,@AMOUNT
,@DISCOUNT
,@FINAL_TOT)
update Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
where Product.Product_ID=@PRO_ID
commit transaction
end try
begin catch
rollback transaction
end catch
您需要像下面这样创建表值参数
CREATE TYPE ProductDetails AS TABLE
(
ProductID INT,
QUANTITY VARCHAR(10),
UNIT NVARCHAR(15),
PRICE DECIMAL(18,2),
AMOUNT DECIMAL(18,2),
DISCOUNT DECIMAL(18,2),
FINAL_TOT INT
)
GO
CREATE PROCEDURE USP_AddNewSellDetails (@invoiceNo INT,@invoice_date DATE, @Produt_Detils ProductDetails READONLY)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO Sell
(ID,sellDate) values (@invoiceNo,@invoice_date)
INSERT INTO Sell_Details (Sell_ID ,Product_ID)
SELECT @invoiceNo, ProductID, QUANTITY ,UNIT ,PRICE ,AMOUNT ,DISCOUNT ,FINAL_TOT FROM @Produt_Detils
DECLARE ProductDetilsCursor CURSOR FOR
SELECT ProductID, QUANTITY FRM @Produt_Detils ORDER BY ProductID
OPEN ProductDetilsCursor
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
WHILE ( @@FETCH_STATUS = 0)
BEGIN
UPDATE Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
WHERE Product.Product_ID=@ProductID
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
END
CLOSE ProductDetilsCursor
DEALLOCATE ProductDetilsCursor
COMMIT TRANSACTION
END
DECLARE @PD ProductDetails;
INSERT @PD VALUES (1,2,'KG',100,200,25,1),(2,5,'PC',50,250,20,6)
EXEC USP_AddNewSellDetails 100,'2-Apr-2018',@PD
然后创建如下所示的过程
CREATE TYPE ProductDetails AS TABLE
(
ProductID INT,
QUANTITY VARCHAR(10),
UNIT NVARCHAR(15),
PRICE DECIMAL(18,2),
AMOUNT DECIMAL(18,2),
DISCOUNT DECIMAL(18,2),
FINAL_TOT INT
)
GO
CREATE PROCEDURE USP_AddNewSellDetails (@invoiceNo INT,@invoice_date DATE, @Produt_Detils ProductDetails READONLY)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO Sell
(ID,sellDate) values (@invoiceNo,@invoice_date)
INSERT INTO Sell_Details (Sell_ID ,Product_ID)
SELECT @invoiceNo, ProductID, QUANTITY ,UNIT ,PRICE ,AMOUNT ,DISCOUNT ,FINAL_TOT FROM @Produt_Detils
DECLARE ProductDetilsCursor CURSOR FOR
SELECT ProductID, QUANTITY FRM @Produt_Detils ORDER BY ProductID
OPEN ProductDetilsCursor
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
WHILE ( @@FETCH_STATUS = 0)
BEGIN
UPDATE Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
WHERE Product.Product_ID=@ProductID
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
END
CLOSE ProductDetilsCursor
DEALLOCATE ProductDetilsCursor
COMMIT TRANSACTION
END
DECLARE @PD ProductDetails;
INSERT @PD VALUES (1,2,'KG',100,200,25,1),(2,5,'PC',50,250,20,6)
EXEC USP_AddNewSellDetails 100,'2-Apr-2018',@PD
在运行以下步骤之前准备表值参数
CREATE TYPE ProductDetails AS TABLE
(
ProductID INT,
QUANTITY VARCHAR(10),
UNIT NVARCHAR(15),
PRICE DECIMAL(18,2),
AMOUNT DECIMAL(18,2),
DISCOUNT DECIMAL(18,2),
FINAL_TOT INT
)
GO
CREATE PROCEDURE USP_AddNewSellDetails (@invoiceNo INT,@invoice_date DATE, @Produt_Detils ProductDetails READONLY)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO Sell
(ID,sellDate) values (@invoiceNo,@invoice_date)
INSERT INTO Sell_Details (Sell_ID ,Product_ID)
SELECT @invoiceNo, ProductID, QUANTITY ,UNIT ,PRICE ,AMOUNT ,DISCOUNT ,FINAL_TOT FROM @Produt_Detils
DECLARE ProductDetilsCursor CURSOR FOR
SELECT ProductID, QUANTITY FRM @Produt_Detils ORDER BY ProductID
OPEN ProductDetilsCursor
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
WHILE ( @@FETCH_STATUS = 0)
BEGIN
UPDATE Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
WHERE Product.Product_ID=@ProductID
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
END
CLOSE ProductDetilsCursor
DEALLOCATE ProductDetilsCursor
COMMIT TRANSACTION
END
DECLARE @PD ProductDetails;
INSERT @PD VALUES (1,2,'KG',100,200,25,1),(2,5,'PC',50,250,20,6)
EXEC USP_AddNewSellDetails 100,'2-Apr-2018',@PD
然后执行如下程序
CREATE TYPE ProductDetails AS TABLE
(
ProductID INT,
QUANTITY VARCHAR(10),
UNIT NVARCHAR(15),
PRICE DECIMAL(18,2),
AMOUNT DECIMAL(18,2),
DISCOUNT DECIMAL(18,2),
FINAL_TOT INT
)
GO
CREATE PROCEDURE USP_AddNewSellDetails (@invoiceNo INT,@invoice_date DATE, @Produt_Detils ProductDetails READONLY)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO Sell
(ID,sellDate) values (@invoiceNo,@invoice_date)
INSERT INTO Sell_Details (Sell_ID ,Product_ID)
SELECT @invoiceNo, ProductID, QUANTITY ,UNIT ,PRICE ,AMOUNT ,DISCOUNT ,FINAL_TOT FROM @Produt_Detils
DECLARE ProductDetilsCursor CURSOR FOR
SELECT ProductID, QUANTITY FRM @Produt_Detils ORDER BY ProductID
OPEN ProductDetilsCursor
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
WHILE ( @@FETCH_STATUS = 0)
BEGIN
UPDATE Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
WHERE Product.Product_ID=@ProductID
FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
END
CLOSE ProductDetilsCursor
DEALLOCATE ProductDetilsCursor
COMMIT TRANSACTION
END
DECLARE @PD ProductDetails;
INSERT @PD VALUES (1,2,'KG',100,200,25,1),(2,5,'PC',50,250,20,6)
EXEC USP_AddNewSellDetails 100,'2-Apr-2018',@PD
别兜圈子。改为使用表值参数。示例和。这是另一个关于“用户定义表类型”的链接@Mohammed Shfq,如果您在运行我的查询语句时遇到任何问题,请告诉我。谢谢