2014-07-22 60 views
1

我收到以下錯誤返回值:並非所有的代碼路徑數組

Not all code paths return a value for Array

這裏是我的代碼:

public Product[] LoadAllDatas() 
    { 
     SqlConnection con = new SqlConnection("Server=####; Integrated Security=true;Database=Store"); 

     SqlCommand cmd = new SqlCommand("usp_LoadTestData"); 
     cmd.Connection = con; 
     con.Open(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlDataReader dr = cmd.ExecuteReader(); 

     while (dr.Read()) 
     { 
      return new Product[] 
      { 
       new Product() { ProductId = Convert.ToInt32(dr["Id"]), Name = dr["Name"].ToString(), AdminContent = dr["AdminComment"].ToString(), ProductTemplate = dr["ProductTemplateId"].ToString(), CreatedOnUtc = Convert.ToDateTime(dr["CreatedOnUtc"]) } 
      }; 
     } 

     con.Close(); 
     con.Dispose(); 
    } 
+0

如果沒有行到上環,所以'while'循環不運行會發生什麼? –

+0

讓我們把返回類型放在一邊。您正在使用while循環並返回最佳情況下的一個項目。閱讀關於IEnumerables和yield關鍵字的內容,因爲它看起來是一個很好的使用它們的地方,或者簡單地返回而不是返回第一行,將數據添加到數組並返回整個數組。 –

回答

4

那麼,你基本上需要考慮,如果發生了什麼dr.Read()返回false - 即,如果沒有結果。你可能想在這種情況下拋出一個異常......或者可能返回一個空的數組。

此外,您應該使用using聲明爲您的讀者,命令和您的連接,關閉它們 - 當前如果您返回結果,您不關閉連接。

最後,你總是會返回一個數組,其中只包含一個單個的Product。那真的是你想要的嗎?我希望你想要返回一個數組全部的結果。

下面是一些示例代碼解決所有這些問題,在沒有結果的情況下返回一個空數組:

public Product[] LoadAllDatas() 
{ 
    using (SqlConnection con = new SqlConnection(...)) 
    { 
     con.Open(); 
     using (SqlCommand cmd = new SqlCommand("usp_LoadTestData", con)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      using (SqlDataReader dr = cmd.ExecuteReader()) 
      { 
       List<Product> results = new List<Product>(); 
       while (dr.Read()) 
       { 
        results.Add(new Product { 
         ProductId = Convert.ToInt32(dr["Id"]), 
         Name = dr["Name"].ToString(), 
         AdminContent = dr["AdminComment"].ToString(), 
         ProductTemplate = dr["ProductTemplateId"].ToString(), 
         CreatedOnUtc = Convert.ToDateTime(dr["CreatedOnUtc"]) 
        }); 
       } 
       return results.ToArray(); 
      } 
     } 
    } 
} 

最後一點 - 如果你的讀者的值是一個合適的類型,我d希望你能夠簡化Product實例化:

new Product 
{ 
    ProductId = (int) dr["Id"], 
    Name = (string) dr["Name"], 
    AdminContent = (string) dr["AdminComment"], 
    ProductTemplate = (string) dr["ProductTemplateId"], 
    CreatedOnUtc = (DateTime) dr["CreatedOnUtc"] 
} 
相關問題