在C#中访问SQL Server存储过程的输出参数(Accessing SQL Server sto

2019-06-27 12:22发布

我有一个简单的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程序,所以我提到这篇文章 。

Answer 1:

我建议你把你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();


Answer 2:

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

cmd.CommandType = CommandType.StoredProcedure;


Answer 3:

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

cmd.ExecuteNonQuery(); 

或者,如果你想用的ExecuteScalar和返回值尝试



Answer 4:

您应该添加

cmd.CommandType = CommandType.StoredProcedure 

调用前



Answer 5:

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

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

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



文章来源: Accessing SQL Server stored procedure output parameter in C#