Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象数组传递给SQL存储过程_C#_Sql_Asp.net_Arrays_Sql Server - Fatal编程技术网

C# 将对象数组传递给SQL存储过程

C# 将对象数组传递给SQL存储过程,c#,sql,asp.net,arrays,sql-server,C#,Sql,Asp.net,Arrays,Sql Server,我有两张桌子 payment(payment\u id,其他成本,车库成本) spareparts(付款id、sparepartId、sparePartQty) 在payment表中,自动生成payment\u id。除了otherCosts和garagecosts值之外,在我的C#asp.net应用程序中,还有一个具有 { sparepartId : 'Somevalue', sparePartQty : 'somevalue' } 我需要做的是在一个存储过程中,首先将记录输入到带有车库

我有两张桌子

  • payment
    payment\u id,其他成本,车库成本)
  • spareparts
    (付款id、sparepartId、sparePartQty)
payment
表中,自动生成
payment\u id
。除了
otherCosts
garagecosts
值之外,在我的C#asp.net应用程序中,还有一个具有

{ sparepartId : 'Somevalue', sparePartQty : 'somevalue' }
我需要做的是在一个存储过程中,首先将记录输入到带有车库成本和其他成本值的付款表中。然后返回最后生成的付款ID,并将其作为数组中每个值对的
paymentId
输入到
spareParts
表中


实现这一目标的途径是什么?请帮助。

要解决您的问题,请尝试以下方法

首先将您的数据插入带有
其他成本
车库成本
付款
表中

然后创建一个过程,从
payment
表中获取最新存储的
payment\u id

create procedure select_last_payment_id
as
begin
    select top 1 payment_id
    from payment
    order by payment_id desc  
end
最后,通过运行存储过程并将其分配给
spareparts
表的
payment\u id
并存储
spareparts
数据来获取
payment\u id


希望它对您有用。

基于您的标记,我假设我们讨论的是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,但请确保阅读并了解与第一个身份相关的风险

如果您需要有两个单独的存储过程,您也可以这样做,下面是第一个存储过程的样子。请注意,
@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#代码传递它们,请参阅或。

您还可以将TVPs与只有一个存储过程的解决方案一起使用。

在多线程环境中可能无法工作,或者如果此代码在可以同时为多个客户端提供服务的服务器(如web前端服务器)上运行,则可能无法工作。当程序
select\u last\u payment\u id
运行时,另一个线程可能已经添加了另一行。还有一种更简单的基于@IDENTITY或SCOPE_IDENTITY()的建立模式来实现此目的。@TFrost与我向Ladi提到的相同。我的问题是得不到lastiD。我需要在第二个表中输入多条记录,lastId为firsttable@IsankaLakshan:对不起,我误解了问题。请看表值参数-。这些类型设计用于保存多个值(SQL Server没有数组的概念)。您是否需要将多条记录插入
付款
表中,并将其各自的记录插入
备用零件
,或者只插入一条
付款
,并且是各自的
备用零件
?感谢您的快速响应。如果my paymentId的第二个表中只有一条记录关联,那么您的代码就可以做到这一点。但我需要的是,对于第一个表中的一个paymentId,我需要在第二个表中输入多条记录。看来我需要两个SPs