2012-08-29 89 views
3

我有一个简单的SQL Server存储过程:访问SQL Server存储过程的输出参数

ALTER PROCEDURE GetRowCount 

(
@count int=0 OUTPUT 
) 

AS 
Select * from Emp where age>30; 
SET @[email protected]@ROWCOUNT; 

RETURN 

我试图访问输出参数,在下面的C#代码:

SqlConnection con = new SqlConnection(); 
con.ConnectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=answers;Integrated Security=True"; 

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = con; 

cmd.CommandText = "GetRowCount"; 
cmd.CommandType=CommandType.StoredProcedure; 
cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int)); 
cmd.Parameters["@count"].Direction = ParameterDirection.Output; 
con.Open(); 
SqlDataReader reader=cmd.ExecuteReader(); 
int ans = (int)cmd.Parameters["@count"].Value; 
Console.WriteLine(ans); 

但在运行代码时,会在代码的最后一行抛出NullReferenceException。我哪里错了?提前致谢!

P.S.我是SQL程序新手,所以我提到了this article

+0

ANKIT我更新了我的代码,你必须只改变你的指令的ExecuteNonQuery –

回答

12

我建议你把你的SqlConnectionSqlCommand分成块,以保证其正确处置。

此外,如果我没有弄错,输出参数只有在完全读取返回的结果数据集后才可用。

由于您似乎并不需要这些 - 为什么不使用.ExecuteNonQuery()来代替?这是否解决了这个问题?

using (SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=answers;Integrated Security=True")) 
using (SqlCommand cmd = new SqlCommand("dbo.GetRowCount", con)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int)); 
    cmd.Parameters["@count"].Direction = ParameterDirection.Output; 

    con.Open(); 
    cmd.ExecuteNonQuery(); // *** since you don't need the returned data - just call ExecuteNonQuery 
    int ans = (int)cmd.Parameters["@count"].Value; 
    con.Close(); 

    Console.WriteLine(ans); 
} 

另外:因为它似乎你在行数只有真正感兴趣的 - 为什么不简化您的存储过程是这样的:

ALTER PROCEDURE GetRowCount 
AS 
    SELECT COUNT(*) FROM Emp WHERE age > 30; 

,然后在你的C#代码中使用此片段:

con.Open(); 

    object result = cmd.ExecuteScalar(); 

    if(result != null) 
    { 
     int ans = Convert.ToInt32(result); 
    } 

    con.Close(); 
+0

我的不好,我在我的代码中有这一行,但不知何故在这里错过了它。我编辑了问题 – ankit0311

+0

@ ankit0311:更新了我的回复 - 尝试使用'.ExecuteNonQuery()' - 是否解决了问题? –

+0

是的,修正了它:) – ankit0311

0

您应该添加

cmd.CommandType = CommandType.StoredProcedure 

调用前

1

只要使用的ExecuteNonQuery,你不能与out参数使用的ExecuteReader在这种情况下

cmd.ExecuteNonQuery(); 

或者,如果你想尝试ExecuteScalar和ReturnValue

+0

我不好,我有一个线我的代码,但不知何故在这里错过了。我编辑了问题 – ankit0311

+0

我更新了我的代码ankit 0311 –

1

你必须指定它是一个存储过程,而不是查询

cmd.CommandType = CommandType.StoredProcedure; 
+0

我的不好,我在我的代码中有这条线,但不知何故在这里错过了它。我编辑了这个问题 – ankit0311

0

我发现问题,它的连接字符串。 但现在,在代码:

usuary = (string)cmd.Parameters["@USUARIO"].Value; 
password = (string)cmd.Parameters["@CLAVE"].Value; 

编译infomrs这就是值均为空...