C# 此SqlParameterCollection不包含SqlParameter

C# 此SqlParameterCollection不包含SqlParameter,c#,sql,sql-server,C#,Sql,Sql Server,我有一个类,它封装了一些Sql功能,但我试图使用的返回参数有问题。我在这个网站上读了很多类似主题的帖子,但并没有找到适合我的解决方案。我曾尝试使用中概述的方法,但似乎仍有问题 以下是存储过程的一个片段(为了简洁起见,我删除了其中的大部分): 这是C#的一个片段: 命令.BeginExecutenQuery()引发以下异常: IndexOutOfRangeException:指定了参数名为“id”的SqlParameter 不包含在此SqlParameterCollection中 我添加返回参数的

我有一个类,它封装了一些Sql功能,但我试图使用的返回参数有问题。我在这个网站上读了很多类似主题的帖子,但并没有找到适合我的解决方案。我曾尝试使用中概述的方法,但似乎仍有问题

以下是存储过程的一个片段(为了简洁起见,我删除了其中的大部分):

这是C#的一个片段:

命令.BeginExecutenQuery()引发以下异常:

IndexOutOfRangeException:指定了参数名为“id”的SqlParameter 不包含在此SqlParameterCollection中


我添加返回参数的方式是否有问题?如果您需要查看更多代码或任何说明,请告诉我。谢谢

@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

在我看来,您没有在存储过程中正确设置参数。您需要在进程开始之前添加它

下面是一个非常示例的过程,它将适用于您的.net代码

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
为什么不干脆用呢

INSERT INTO A_Table (col1, col2, col3)
VALUES (val1, val2, val3)
SELECT SCOPE_IDENTITY()
在C#一侧


因为你试图同时做很多事情,你需要分号;在每个命令之后。。。插入到/values;,声明设置返回;我懂了。感谢您的快速反馈和澄清。存储过程实际上是由公司开发团队开发的,我将无法更新它。它确实缺少在过程开始时声明的返回参数。从ssms内部执行时,它工作正常。这是从C#执行的失败原因吗?@jamesd7198我不是100%确定,但ADO.NET可能会将其识别为标量查询。您应该能够像下面Steve的回答中那样运行ExecuteScalar()。是的,关键是ExecuteScalar只返回一行和该行的第一列。这就是我感谢那些帮助我的人的情况。我发现了我的问题,它源于一个打字错误。在我的存储过程函数中,我试图访问返回参数,但返回参数中没有“@”。添加该选项以解决问题。这是在没有显示的命令.EndExecuteNonQuery()之后的代码中。感谢您的反馈!实际上,它并没有像上面提到的那样在存储过程中声明。
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
INSERT INTO A_Table (col1, col2, col3)
VALUES (val1, val2, val3)
SELECT SCOPE_IDENTITY()
object result = command.ExecuteScalar();
if(result != null)
{
   int lastID = Convert.ToInt32(result);
}