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,如果您在运行我的查询语句时遇到任何问题,请告诉我。谢谢