我有一个简单的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程序,所以我提到这篇文章 。
我建议你把你SqlConnection
和SqlCommand
成块的使用,使他们正确处理保证。
另外,如果我没有记错,输出参数仅供您已经完全阅读多数民众赞成在返回结果数据集之后。
既然你似乎并不需要,在所有-为什么不使用.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();
你必须指定它是一个存储过程,而不是查询
cmd.CommandType = CommandType.StoredProcedure;
只要使用的ExecuteNonQuery,你不能输出参数在这种情况下使用的ExecuteReader
cmd.ExecuteNonQuery();
或者,如果你想用的ExecuteScalar和返回值尝试
您应该添加
cmd.CommandType = CommandType.StoredProcedure
调用前
我发现这个问题,它的连接字符串。 但现在,在代码:
usuary = (string)cmd.Parameters["@USUARIO"].Value;
password = (string)cmd.Parameters["@CLAVE"].Value;
编译器infomrs这就是值为空...