3

我有一个简单的 SQL Server 存储过程:

ALTER PROCEDURE GetRowCount

(
@count int=0 OUTPUT
)

AS
Select * from Emp where age>30;
SET @count=@@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。我哪里错了?提前致谢!

PS 我是 SQL 过程的新手,所以我参考了这篇文章

4

5 回答 5

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();
于 2012-08-29T09:11:16.840 回答
1

只需使用 ExecuteNonQuery ,在这种情况下你不能使用 ExecuteReader 没有参数

cmd.ExecuteNonQuery(); 

或者,如果您想尝试使用 ExecuteScalar 和 ReturnValue

于 2012-08-29T09:10:47.153 回答
1

您必须指定它是存储过程而不是查询

cmd.CommandType = CommandType.StoredProcedure;
于 2012-08-29T09:11:32.233 回答
0

你应该添加

cmd.CommandType = CommandType.StoredProcedure 

在调用它之前

于 2012-08-29T09:10:28.080 回答
0

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

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

编译器 infomrs 那值是空的...

于 2013-07-15T05:37:42.630 回答