将一组对象传递给SQL存储过程

时间:2015-09-20 04:57:20

标签: c# sql asp.net arrays sql-server

我有2张桌子

  • payment payment_id ,其他成本,GarageCosts)
  • spareparts(payment_id,sparepartId,sparePartQty)

paymentpayment_id中自动生成。除了otherCostsgaragecosts值之外,在我的C#asp.net应用程序中还有一个带

的对象数组
{ sparepartId : 'Somevalue', sparePartQty : 'somevalue' }

我需要做的是在存储过程中首先将记录输入到支付表中,其中包含车库成本和其他成本值。然后返回最后生成的付款ID,并将其作为spareParts表输入数组中的每个值对。{/ p>

实现这一目标的方法是什么?请帮忙。

2 个答案:

答案 0 :(得分:0)

要解决您的问题,请尝试此

首先使用paymentotherCostsGarageCosts表中插入您的数据。

然后创建一个过程以从payment_id

获取最新存储的payment
create procedure select_last_payment_id
as
begin
    select top 1 payment_id
    from payment
    order by payment_id desc  
end

最后通过运行存储过程并将其分配到payment_id payment_id表并存储spareparts数据来获取spareparts

希望它适合你。

答案 1 :(得分:0)

根据你的标签,我假设我们正在谈论SQL Server / T-SQL 您可以在一个存储过程中完成所有这些操作:

CREATE PROCEDURE dbo.Foo ... /* input parameters */
AS
BEGIN
    DECLARE @PaymentId int

    INSERT INTO payment(otherCosts, GarageCosts) VALUES (...)
    SET @PaymentId = SCOPE_IDENTITY()
    INSERT INTO spareparts(payment_id, sparepartId, sparePartQty) VALUES(@PaymentId, ...) 

END
GO

您可能还想查看@@ IDENTITY,但请务必阅读@@IDENTITYSCOPE_IDENTITY,并了解与第一个相关的风险。

如果你需要有两个单独的sprocs,你也可以这样做,这是第一个sproc的样子。请注意,@PaymentId是输出参数,这意味着调用者可以检索它并将其传递给第二个过程。

CREATE PROCEDURE dbo.Foo 
    /* input parameters */
    @PaymentId int OUT
AS
BEGIN
    INSERT INTO payment(otherCosts, GarageCosts) VALUES (...)
    SET @PaymentId = SCOPE_IDENTITY()
END
GO

编辑 - 在澄清问题的范围后:

如果需要调用第二个存储过程并传递一个参数数组,使用SQL Server 2008或更新版本,您可以使用TVP(表值参数)。要了解如何在存储过程中使用它们以及如何从C#代码中传递它们,请参阅Table Value Parameters in SQL Server 2008 and .NET (C#)Table-Valued Parameters
您也可以将TVP用于只有一个sproc的解决方案。