2010-11-24 146 views
1

我想如下檢索存儲過程在SQL Server 2005中的返回值:在C#中的存儲過程的返回值返回錯誤

 OleDbCommand comm = new OleDbCommand(process_name, connection); 
     comm.CommandType = CommandType.StoredProcedure; 

     for (int i = 0; i < process_parameters.Length; i++) 
      comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

     //Add output param 
     comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

     comm.ExecuteNonQuery(); 

當的ExecuteNonQuery()被調用,但是,我找回OleDbException說:「過程或函數myStoredProcedure指定的參數太多。」我的存儲過程開始,如下所示:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT] 
(
      @Param1  char (64), 
      @Param2  char (128), 
      @Param3  char (64), 
) 
AS 
BEGIN 
    Declare  @TestID   int 

而且具有以下結尾:

RETURN @TestID 
END 

這是否將返回值聲明,而不是作爲一個參數傳遞的事實,有什麼關係用它?如果是這樣,我怎麼能得到存儲過程開始後聲明的參數的返回值?謝謝你的幫助。

更新: 我試過到目前爲止建議的修改,添加以下行:

  OleDbCommand comm = new OleDbCommand(process_name, connection); 
      comm.CommandType = CommandType.StoredProcedure; 

      for (int i = 0; i < process_parameters.Length; i++) 
       comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

      var testID = (int)comm.ExecuteScalar(); 

現在,當ExecuteScalar()被執行,我得到一個的NullReferenceException對象引用不設置到對象實例

注:我也嘗試將其設置爲一個整數int testID = (int)comm.ExecuteScalar();,我仍然得到相同的錯誤。

回答

0

好吧,我能得到它的正常工作。我的問題是,我忽略了將任何參數聲明爲OUTPUT,我添加了一個額外的變量並將其設置爲輸出變量並使存儲過程返回該變量。字後,我剛檢查了輸出參數,調用存儲過程,從我的C#代碼後,下面顯示的變化:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT] 
(
      @Param1  char (64), 
      @Param2  char (128), 
      @Param3  char (64), 
      @ReturnValue int OUTPUT 
) 
AS 
BEGIN 
    Declare  @TestID   int 

,並在年底做一個簡單的變化:

SET @ReturnValue = @TestID 
    RETURN @ReturnValue 
END 

最後,回到我的代碼:

 OleDbCommand comm = new OleDbCommand(process_name, connection); 
     comm.CommandType = CommandType.StoredProcedure; 

    for (int i = 0; i < process_parameters.Length; i++) 
     comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

     //Add output param 
     comm.Parameters.Add("@ReturnValue", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

     comm.ExecuteNonQuery(); 
     Console.WriteLine("Stored Procedure returned a value of "+ comm.Parameters["@ReturnValue"].Value); //Success 

謝謝大家的建議。歡迎任何替代品或進一步的見解。

5

變化

comm.ExecuteNonQuery(); 

int returnValue = (int) comm.ExecuteScalar(); 

,並刪除:

comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 
0

我想的ExecuteNonQuery()不會從SQL返回任何東西.....我錯過這裏有什麼?

+0

如果存在實際上是一個OUTPUT參數在proc定義中,那麼他可以使用ExecuteNonQuery並只讀取新的參數值。但是,OP有點混亂 – NotMe 2010-11-24 23:10:46

0

刪除這些:

//Add output param 
     comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

     comm.ExecuteNonQuery(); 

,並用這個來代替:var testID = (int) comm.ExecuteScalar();

0

針對接受的答案...

因爲你設置DirectionReturnValue這裏的參數的:

comm.Parameters.Add("@ReturnValue", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

你不要在你的存儲過程需要一個OUTPUT參數都沒有。在結束

RETURN @TestID 
END 

,它仍然會工作完全像現在一樣:你可以將其改回:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT] 
(
     @Param1  char (64), 
     @Param2  char (128), 
     @Param3  char (64), 
) 
AS 
BEGIN 
    Declare  @TestID   int 

帶。

這是純屬巧合你用C ReturnValueParameter#負有相同的名稱OUTPUT參數。對於OUTPUT參數,有一個單獨的參數Direction

0

我有同樣的問題,問題是,你必須聲明返回參數第一(之前的輸入和輸出的),這樣一來它的工作原理:

OleDbCommand comm = new OleDbCommand(process_name, connection); 
comm.CommandType = CommandType.StoredProcedure; 

//Add the return param first 
comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

for (int i = 0; i < process_parameters.Length; i++) 
    comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

comm.ExecuteNonQuery(); 
Object return_value = comm.Parameters["@TestID"].Value;