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\u id,其他成本,车库成本)payment
(付款id、sparepartId、sparePartQty)spareparts
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