簡體   English   中英

在C#中訪問SQL Server存儲過程輸出參數

[英]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的新手,所以我參考了這篇文章

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

只需使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM