请求不需要的参数的 Visual C# 存储过程



存储过程:

ALTER PROCEDURE VendorsRowcount
    @RowCount int OUTPUT
AS
    SET NOCOUNT ON
    SELECT * 
    FROM dbo.Vendors
    SET @RowCount = @@ROWCOUNT
    RETURN @RowCount

C#:

using (var conn = new SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Pricer;Persist Security Info=True;User ID=xxx;Password=xxx"))
using (var command = new SqlCommand("VendorsRowcount", conn)
{
    CommandType = CommandType.StoredProcedure
})
{
    conn.Open();
    command.ExecuteNonQuery();
    conn.Close();
}

我得到错误:

附加信息:过程或函数"VendorsRowcount"需要参数"@RowCount",但未提供该参数。

在开始学习VB之后,我才刚刚开始学习C#,并意识到互联网上有更多的C#资源。

这可能是一个愚蠢的问题,但我已经搜索过了,也许我使用的术语不是正确的,因为我找不到答案。

据我所知,我不需要发送参数,因为@RowCount是输出的。

为什么会出现此错误?

如果在存储过程中声明一个参数,它与声明为OUTPUT的事实无关。您需要从C#代码中传递它。另一种选择是将参数声明为可选参数,如另一个答案所示。然而,你现在有一个问题。如何在C#代码中读取该参数的值?

第一个选项,在存储过程中传递参数并读回

conn.Open();
SqlParameter prm = command.Parameters.Add(new SqlParameter("@RowCount", SqlDbType.Int));
prm.Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
Console.WriteLine(prm.Value.ToString());
conn.Close();

第二个选项,将参数设置为可选,调用SqlCommandBuilder.DeriveParameters方法来填充C#端的parameter集合并将其读回。(请阅读链接中关于此解决方案效率的备注部分)

-- in the stored procedure
@RowCount int = 0 OUTPUT

conn.Open();
SqlCommandBuilder.DeriveParameters(command);
command.ExecuteNonQuery();
Console.WriteLine(command.Parameters["@RowCount"].Value.ToString());
conn.Close();

然而,我感到困惑的是,您运行了一个可能代价高昂的SELECT *命令,但似乎对返回的记录不感兴趣。

在这种情况下,StoredProcedure似乎太多了,并且增加了维护问题,而您只需写以下内容就可以获得行计数:

conn.Open();
command.CommandText = "SELECT COUNT(*) FROM Vendors";
int rowCount = Convert.ToInt32(command.ExecuteScalar());
Console.WriteLine(rowCount.ToString());
conn.Close();

您需要传入该参数。下面是一个如何做到这一点的好例子:

在ADO.NET 中获取输出参数值

如果参数应该是可选的,则必须在存储过程中提供默认值。

例如:@RowCount int OUTPUT=0

最新更新