我有一个.NET 2010应用程序,命中SQL2000数据库。该代码非常基本。当我插入记录时,将插入记录,但不会返回ID。 id列是一个int,它是一个Idetity。这是存储的过程...
ALTER PROCEDURE Insert_Vendor
@CorpID as varchar(255),
@TaxpayerID as varchar(255)
AS
Insert into dbo.Vendor
(
vdr_CorpID,
vdr_TaxpayerID
)
values
(
@CorpID,
@TaxpayerID
)
IF @@error <> 0
BEGIN
RETURN -1
END
ELSE
RETURN @@Identity
GO
在接收端...
int myID = (int)(db.ExecuteScalar(dbCommand));
...所以您将使用SELECT SCOPE_IDENTITY()
而不是RETURN SELECT SCOPE_IDENTITY()
执行查询,并返回第一行的第一列查询返回的结果集
所以您需要将RETURN语句重写为:
SELECT -1
并且(因为scope_indentity()
返回numeric(38,0)
)
SELECT CAST(SCOPE_IDENTITY() AS INT)
分别
您必须在插入后立即调用@@ IDENTITY,请改用Scope_identity()。
由于您的问题遗漏了许多细节,我将仅提及几种可能的解决方法,因为没有所有细节似乎无法回答问题。但这是您第一次来这里,您会变得更好。你会说对吗?
无论如何,首先我要说的是,您应该始终使用scope_identity,因为它更安全。幕后可能会发生某些事情,而触发器可能会导致此实际问题。坚持使用scope_identity,您不必担心。
第二个我建议代替
RETURN
使用
SELECT SCOPE_IDENTITY()
最后,我要说为什么不只使用OUTPUT参数而不是返回结果。我没有任何东西可以支持下一条声明,但我认为这会更好。再次没有任何证据,但是输出参数与模式附带的结果集的开销似乎较小。
只是我的想法。
我个人建议使用SCOPE_IDENTITY而不是@@ IDENTITY。话虽这么说,问题出在存储过程中。上面的Devio是正确的,执行标量正在寻找第一行的第一列。 RETURN语句不会执行此操作,因此您将需要使用以下任一项:
IF @@error <> 0
BEGIN
Select -1
END
ELSE
Select @@Identity
或:
IF @@error <> 0
BEGIN
Select -1
END
ELSE
Select SCOPE_IDENTITY()