Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual C存储过程请求不需要的参数_C#_Sql_Sql Server 2008 - Fatal编程技术网

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查询。非常感谢。