2010-09-21 108 views
4

從繼承的一些源代碼看,有一小段代碼調用SQL存儲過程進行更新。如何檢查C#上的存儲過程更新結果#

存儲過程返回-1萬一出了差錯:

IF @@Error <> 0 
    BEGIN 
     ROLLBACK TRAN 
     SELECT -1 
     RETURN 
    END 
COMMIT TRAN 
SELECT 0 

的C#代碼是這樣的:

System.Data.SqlClient.SqlDataReader myReader; 
    try{ 
     SqlDbConnection.Open(); 
     SqlDbCommand.Connection = SqlDbConnection; 
     SqlDbCommand.CommandType = System.Data.CommandType.StoredProcedure; 
     SqlDbCommand.CommandText = "StoredProcedured_UpdateFoo"; 
     SqlDbCommand.Parameters.Clear(); 
     SqlDbCommand.Parameters.Add("@FooData", SqlDbType.DateTime); SqlDbCommand.Parameters["@FooData"].Value = System.DateTime.Now.ToString("yyyy-MM-dd"); 
     myReader = SqlDbCommand.ExecuteReader(); 
     if (myReader.Read()) 
      { 
      if (int.Parse(myReader.GetValue(0).ToString()) == -1) throw new ErrorDataTxRx("Error FOO "); 
      } 
    } finally { 
     if (SqlDbConnection.State != ConnectionState.Closed){ 
      SqlDbConnection.Close(); 
     } 

     if (myReader != null){    
      if (!myReader.IsClosed) myReader.Close(); 
     } 
    } 

我也看到了相同的代碼的一部分,檢查相同用Fill方法使用System.Data.DataSet()。
有沒有更好的方法來檢查返回值是否爲-1?
在這種情況下可以使用ExecuteReader嗎?

回答

6

您是否嘗試過使用ExecuteScalar?這是專爲它返回一個值的查詢:

執行查詢,並返回查詢返回的結果 集中的第一行的 第一列。 其他行或列 忽略

+0

-1 ....結果集的第一行與返回值根本不同。 SP的實際返回值(數值)可用於指示錯誤/狀態信息。檢查SP調用語法,地址爲http://msdn.microsoft.com/en-us/library/aa258848(SQL.80).aspx – TomTom 2010-09-21 11:18:35

+0

@TomTom:雖然這當然是真的,但看看現有的代碼 - 它*是*閱讀結果集的第一個值,就像填充一個'DataSet'一樣。假設這是OP所需要的,我相信'ExecuteScalar'會做同樣的事情,更簡單。 – 2010-09-21 11:20:59

+0

+1 - 不會被OP使用的稍微不正確的術語所迷惑。 ;) – Lucero 2010-09-21 12:01:47

0

而使用ExecuteNonQuery,而不是讀者,你會得到受影響的行數。

你的問題還不夠清楚。你可能需要像Lucero寫的那樣使用ReturnValue。

3

正如喬恩正確指出的那樣,你實際上並沒有使用SP的返回值,而是實際獲得了第一行的第一個值,這就是ExecuteScalar將以更簡單的方式執行的操作。

然而,爲了從SP獲得的返回值(例如,從SP SQL代碼類似RETURN @i;),你需要它的方向增加一個新的參數,並設置爲ReturnValue,這樣的事情:

SqlParameter returnValueParam = new SqlParameter(); 
returnValueParam.DbType = DbType.Int32; 
returnValueParam.IsNullable = false; 
returnValueParam.Direction = ParameterDirection.ReturnValue; 
SqlDbCommand.Parameters.Add(returnValueParam); 
// execute SP here... 
int returnValue = (int)returnValueParam.Value; 
+0

我已經添加了部分存儲過程代碼。正如你所看到的,它是一個SELECT -1。 – systempuntoout 2010-09-21 12:42:00

+1

@systempuntoout感謝您的編輯。既然是關於代碼審查,我會說使用'SELECT someint'而不是SP返回值是一種不好的做法,並增加了不必要的開銷。 – Lucero 2010-09-21 15:48:48

+0

謝謝,你可以稱它爲複製粘貼轉移。 – systempuntoout 2010-09-21 16:28:41