2014-08-29 55 views
1

存储过程: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(); 
} 

我收到错误:

Additional information: Procedure or function 'VendorsRowcount' expects parameter '@RowCount', which was not supplied.

我只是在学习VB之后学习C#并意识到Internet上的C#有更多的资源。

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

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

为什么我得到这个错误?

+3

但是你'@ RowCount'在你的SP? – 2014-08-29 20:50:23

回答

3

如果您在存储过程中声明一个参数,它没有相关声明为输出的事实。你需要从你的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#侧参数的收集和阅读背部。 (请阅读提供了有关该解决方案的效率,在链接的注释部分)

-- 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(); 
+0

这工作完美。而且我知道我的代码会/会很糟糕。我是一名网络技术人员,而不是程序员。我的工作只是告诉我也要成为一名程序员,所以我在努力。我有大约3周的VB使用经验,而且我正忙于C#的第一天。我相信会有更多愚蠢的问题来临。 – Katp00p 2014-08-29 22:30:14

+0

这似乎与输入查询一样困难。我使用存储过程,因为我认为他们会节省时间。 – Katp00p 2014-08-29 22:33:33

+0

除非真正需要进行复杂的操作或挤压性能的最后一点,否则我建议远离SP来进行简单的SELECT操作。例如,您可以以更简单的方式获得记录的COUNT(*) – Steve 2014-08-29 22:41:48

1

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

例如: @RowCount INT输出= 0