C# Visual C存储过程请求不需要的参数
存储过程:C# Visual C存储过程请求不需要的参数,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,存储过程: ALTER PROCEDURE VendorsRowcount @RowCount int OUTPUT AS SET NOCOUNT ON SELECT * FROM dbo.Vendors SET @RowCount = @@ROWCOUNT RETURN @RowCount C: 我得到一个错误: 其他信息:过程或函数“VendorRowCount”需要参数“@RowCount”,但未提供该参数 我刚开始学习VB,意识到
ALTER PROCEDURE VendorsRowcount
@RowCount int OUTPUT
AS
SET NOCOUNT ON
SELECT *
FROM dbo.Vendors
SET @RowCount = @@ROWCOUNT
RETURN @RowCount
C:
我得到一个错误:
其他信息:过程或函数“VendorRowCount”需要参数“@RowCount”,但未提供该参数
我刚开始学习VB,意识到互联网上有很多C语言的资源,我正在学习C语言
这可能是一个愚蠢的问题,但我已经搜索过了,可能我使用的术语不正确,因为我找不到答案
就我所知,我不需要发送参数,因为@RowCount是输出
为什么会出现此错误?如果参数应为可选参数,则必须在存储过程中提供默认值 例如:
@RowCount int OUTPUT=0如果该参数是可选的,则必须在存储过程中提供默认值 例如:
@RowCount int OUTPUT=0您需要传入该参数。下面是一个很好的例子,说明了如何做到这一点:
您需要传入该参数。下面是一个很好的例子,说明了如何做到这一点:
如果在存储过程中声明参数,则该参数与声明为输出的事实无关。您需要从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();
第二个选项,将参数设置为可选,调用该方法填充C端的参数集合并将其读回。请阅读链接中有关此解决方案效率的备注部分
-- 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();
如果在存储过程中声明参数,则该参数与声明为输出的事实无关。您需要从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();
第二个选项,将参数设置为可选,调用该方法填充C端的参数集合并将其读回。请阅读链接中有关此解决方案效率的备注部分
-- 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();
但是您的sp中有@RowCount?但是您的sp中有@RowCount?这非常有效。而且我知道我的代码确实/将会很糟糕。我是网络技术人员,不是程序员。我的工作告诉我也要成为一名程序员,所以我正在努力。我有大约3周的VB经验,现在正是我第一天玩C的时候。我确信还有很多更愚蠢的问题要问。这似乎和键入查询一样困难。我之所以使用存储过程,是因为我认为它们可以节省时间。除非真的需要复杂的操作或压缩最后一点性能,否则我建议远离SP,只做一个简单的选择。例如,您可以用一种更简单的方法获得记录的计数*。我现在正在研究ado.net查询。谢谢你,这很好用。而且我知道我的代码确实/将会很糟糕。我是网络技术人员,不是程序员。我的工作告诉我也要成为一名程序员,所以我正在努力。我有大约3周的VB经验,现在正是我第一天玩C的时候。我确信还有很多更愚蠢的问题要问。这似乎和键入查询一样困难。我之所以使用存储过程,是因为我认为它们可以节省时间。除非真的需要复杂的操作或压缩最后一点性能,否则我建议远离SP,只做一个简单的选择。例如,您可以用一种更简单的方法获得记录的计数*。我现在正在研究ado.net查询。非常感谢。