SqlParameter未包含此SqlParameterCollection

时间:2013-12-30 20:29:17

标签: c# sql sql-server

我有一个包含一些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中。

我添加返回参数的方式有问题吗?如果您需要查看更多代码或任何说明,请与我们联系。谢谢!

3 个答案:

答案 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);
}