[英]Accessing SQL Server stored procedure output parameter in C#
我有一個簡單的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 Procedures的新手,所以我參考了這篇文章 。
我建議你把你的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();
只需使用ExecuteNonQuery,在這種情況下就不能使用帶有out參數的ExecuteReader
cmd.ExecuteNonQuery();
或者,如果您想嘗試使用ExecuteScalar和ReturnValue
您必須指定它是存儲過程而不是查詢
cmd.CommandType = CommandType.StoredProcedure;
你應該添加
cmd.CommandType = CommandType.StoredProcedure
在打電話之前
我發現問題,它的連接字符串。 但現在,在代碼中:
usuary = (string)cmd.Parameters["@USUARIO"].Value;
password = (string)cmd.Parameters["@CLAVE"].Value;
編譯器infomrs那個值為null ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.