2012-06-12 21 views
1

由於顯然錯誤地解析了輸出存儲過程參數,我遇到了此錯誤。從存儲過程中放置​​輸出參數解析

的輸出參數 'whichID' 必須分配到控制離開當前方法之前

代碼:

public static bool CreateFilmTest(string param1, string param2, out int whichID) 
{ 
      DbCommand com = GenericDataAccess.CreateCommand(); 
      com.CommandText = "CatalogCreateFilmTest"; 

      DbParameter param = com.CreateParameter(); 
      param.ParameterName = "@param1"; 
      param.Value = param1; 
      param.DbType = DbType.String; 
      param.Size = 200; 
      com.Parameters.Add(param); 
      ..........    
      param = com.CreateParameter(); 
      param.ParameterName = "@Fid"; 
      param.Direction = ParameterDirection.Output; 
      param.DbType = DbType.Int32; 
      com.Parameters.Add(param); 

      int result = -1; 

      try 
      { 
       result = GenericDataAccess.ExecuteNonQuery(com); 

       whichID = Int32.Parse(com.Parameters["@Fid"].Value.ToString()); 

      } 
      catch 
      { 
       // .... 
      } 


      return (result >= 1); 
} 

如果我放置:whichID = Int32.Parse(com.Parameters["@Fid"].Value.ToString()); 立即行返回前行,該方法執行成功,並給出正確的結果。

但是,如果我將它放在try括號內,它會給出開頭提到的錯誤。

爲什麼這樣?

我的第一選擇是把它的嘗試支架內,因爲如果由於任何原因ExecuteNonQuery失敗,它沒有任何意義,以處理其輸出參數(whichID)。因此,我最好在try塊內部結合兩個元素(過程的執行和過程中的輸出參數的處理),在錯誤的情況下觸發catch內的這種情況的優雅處理。

您的建議非常感謝。謝謝。安娜

+1

如果您將'whichID = ....'行放入try..catch中 - 您需要初始化'whichID' ** out **參數,並在'try之外的某處添加值。 .catch「塊(或在」catch「部分內)。 ** out **參數**必須始終**分配一個值 –

回答

1

推理是,如果你把它放在try中,沒有合理的確定的任務發生。你可以通過在方法中早些分配一個默認值來解決這個問題(比如,在第一行將它設置爲零)。

1

如果沒記錯,這是因爲try以這樣一種方式,包括內部try編譯,意味着節目流可能無法正確踏進try起(出發之前,即使你通常認爲try沒有按」 t本身中斷程序流程,就像if一樣)。

然後這會觸發編譯器檢查針對out退出該方法之前分配的參數。

只需在方法的最頂端默認值即可。內存確實服務...語言規範知道所有。

12.3.3.15 Try-catch-finally statements(具體賦值分析爲try-catch-finally)。對於 形式的一個try-catch-finally語句

明確賦值分析:

try [try-block] 
catch (…) [catch-block-1] 
… 
catch (…) [catch-block-n] 
finally [finally-block] 

是因爲如果語句來完成的是一個try-finally語句包圍 try-catch語句:

try { 
try [try-block] 
catch (…) [catch-block-1] 
… 
catch (…) [catch-block-n] 
} 
finally [finally-block] 

一個例子:

class A 
{ 
    static void F() { 
     int i, j; 
     try { 
      goto LABEL; 
      // neither i nor j definitely assigned 
      i = 1; 
      // i definitely assigned 
     } 
     catch { 
      // neither i nor j definitely assigned 
      i = 3; 
      // i definitely assigned 
     } 
     finally { 
      // neither i nor j definitely assigned 
      j = 5; 
      // j definitely assigned 
     } 
     // i and j definitely assigned 
     LABEL:; 
     // j definitely assigned 
    } 
} 
0

您得到該錯誤的原因是由於try/catch由編譯器處理的方式。 try/catch塊是某種意義上的條件語句。如果它之前的代碼沒有拋出異常,那麼它內部的代碼只會執行,並且代碼本身只在它本身不引發異常時纔會結束執行。

如果你只是在try中定義一個變量(或者只在catch(es)中),那麼你不能確定那些代碼行將會運行。如果您的變量只在try-block中定義,那麼如果之前或之後發生異常,則可能會跳過該變量。如果你的變量只在catch子句中定義,那麼如果沒有發生異常,它將被跳過。

您最好在您輸入try-catch塊之前聲明默認值,或者在catch子句中聲明失敗值。