2011-10-14 48 views
6

我是編寫存儲過程的新手。所以我寫了一個輸出參數,想要訪問輸出值,很熱。如何在存儲過程中使用OUTPUT參數

我的存儲過程:

ALTER PROCEDURE selQuery 
    (
     @id int, @code varchar(50) OUTPUT 
    ) 
AS 
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id 
    RETURN @code 

如果試圖設置「@碼= RecItemCode」收到錯誤爲:「該賦值給變量不能與數據檢索操作結合使用SELECT語句」

,我使用存儲過程爲:

con.Open(); 
cmd.Parameters.AddWithValue("@id", textBox1.Text); 
SqlParameter code = new SqlParameter("@code", SqlDbType.Int); 
code.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(code); 
SqlDataReader sdr = cmd.ExecuteReader(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error 
con.Close(); 

錯誤:「對象引用不設置到對象的實例。」 我想獲得輸出參數的值。如何獲得?

謝謝。

回答

7

您的SP中的SQL是錯誤的。你可能想

Select @code = RecItemCode from Receipt where RecTransaction = @id 

在你的說法,你是不是設置@code,你要使用它RecItemCode的價值。當你嘗試使用輸出參數時,這會解釋你的NullReferenceException,因爲一個值永遠不會被分配給它,並且你得到一個默認的空值。

的另一個問題是,如果你重寫SQL語句作爲

Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id 

它是混合變量賦值和檢索數據。這突出了幾點。如果除了數據的其他部分外,還需要驅動@code的數據,請忘記輸出參數並選擇數據。

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

如果您只是需要代碼,請使用我向您展示的第一條SQL語句。在副手的機會,你真正需要的輸出數據,使用兩個不同的語句

Select @code = RecItemCode from Receipt where RecTransaction = @id 
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

這應該賦予你的價值的輸出參數以及返回數據的兩列在一排。然而,這讓我感到非常多餘。

如果按照我在頂部所示的方式編寫SP,只需調用cmd.ExecuteNonQuery();,然後讀取輸出參數值。


您的SP和代碼的另一個問題。在您的SP中,您已聲明@code爲varchar。在您的代碼中,您將參數類型指定爲Int。請更改您的SP或您的代碼以使類型一致。


還要注意:如果你正在做的是返回一個值,還有另一種方式做到這一點,不涉及輸出參數在所有。你可以寫

Select RecItemCode from Receipt where RecTransaction = @id 

然後用object obj = cmd.ExecuteScalar();得到結果,沒有必要在SP或在你的代碼的輸出參數。

+0

感謝安東尼,它幫助了很多....許多感謝 – Sandy

+0

感謝您和+1。 'object obj = cmd.ExecuteScalar();'完美地工作。我能夠完成我需要的C#代碼兩行內容,第二個是「的myString = obj.ToString();」。 – FumblesWithCode

24

有你需要解決得到它的工作

  1. 幾樣東西的名稱是錯誤的它不是@ouput@code
  2. 您需要設置參數方向設置爲輸出。
  3. 不要使用AddWithValue,因爲它不應該只有你的價值Add
  4. 使用ExecuteNonQuery如果你沒有返回行

嘗試

SqlParameter output = new SqlParameter("@code", SqlDbType.Int); 
output.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(output); 
cmd.ExecuteNonQuery(); 
MessageBox.Show(output.Value.ToString()); 
+0

很大,但如何獲取輸出參數的值? output.Value.ToString()給出的錯誤爲「對象引用未設置爲對象的實例」。 – Sandy

+0

並沒有說「你忘了」,因爲我沒有忘記,實際上我不知道:-( – Sandy

+0

@rapsalands,* *之後*你執行查詢,從參數中檢索值'cmd.ExecuteNonQuery(); int value = (int)output.Value;' –

1

您需要定義輸出參數爲與ParameterDirection.Output枚舉代碼的輸出參數。這裏有很多例子,但是這裏有一個關於MSDN的例子。

1
SqlCommand yourCommand = new SqlCommand(); 
yourCommand.Connection = yourSqlConn; 
yourCommand.Parameters.Add("@yourParam"); 
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output; 

// execute your query successfully 

int yourResult = yourCommand.Parameters["@yourParam"].Value; 
+0

我收到錯誤消息。看到編輯帖子......謝謝 – Sandy

+0

@rapsalands你不能只執行代碼。它不是一個獨立的代碼塊。該錯誤是說你沒有實例化一個對象(即創建它的一個新實例)。這只是給你一個關於如何從存儲過程的輸出參數中獲取值的一般概念。 – 2011-10-14 17:38:37

+0

其實我試圖學習SP,之前從未做過。如果你能說出我的代碼有什麼問題,那將會很棒。我的意思是我必須創建實例? – Sandy

0

您需要先關閉連接,然後才能使用輸出參數。 像這樣

con.Close(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); 
相關問題