我有一个包含一些Sql功能的类,并且遇到了我正在尝试使用的返回参数的问题。我在这个网站上阅读了很多类似主题的帖子,但我找不到适合我的解决方案。我尝试使用this related topic中概述的方法,但我似乎仍有问题。
以下是存储过程的片段(为简洁起见,我删除了大部分内容):
INSERT INTO A_Table (col1, col2, col3)
VALUES (val1, val2, val3)
DECLARE @id int
SET @id = SCOPE_IDENTITY()
RETURN @id
这是C#的片段:
SqlParameter rtnParam = new SqlParameter("@id", SqlDbType.Int);
rtnParam.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(rtnParam);
IAsyncResult result = command.BeginExecuteNonQuery();
command.EndExecuteNonQuery(result);
command.BeginExecuteNonQuery()抛出以下异常:
IndexOutOfRangeException:具有ParameterName'id'的SqlParameter是 不包含在此SqlParameterCollection中。
我添加返回参数的方式有问题吗?如果您需要查看更多代码或任何说明,请与我们联系。谢谢!
答案 0 :(得分:1)
@id
声明为SQL中的存储过程参数之一。所以像这样:
CREATE PROCEDURE sproc_name
.
.
@id INT
.
.
AS
BEGIN
INSERT INTO A_Table (col1, col2, col3)
VALUES (val1, val2, val3)
SET @id = SCOPE_IDENTITY()
RETURN @id
END
答案 1 :(得分:0)
在我看来,您没有在存储过程中正确设置参数。您需要在proc开始之前添加它
这是一个非常适合您的.net代码的示例proc
CREATE PROCEDURE testproc
-- Add the parameters for the stored procedure here
@id int
AS
BEGIN
DECLARE @id1 int;
SET @id1 = SCOPE_IDENTITY()
RETURN @id1
END
GO
答案 2 :(得分:0)
为什么不简单地使用
INSERT INTO A_Table (col1, col2, col3)
VALUES (val1, val2, val3)
SELECT SCOPE_IDENTITY()
在C#方面
object result = command.ExecuteScalar();
if(result != null)
{
int lastID = Convert.ToInt32(result);
}