2009-05-17 84 views
1

我知道我對C#專家的要求可能沒有多大意義,但我會解釋我想要做什麼,然後可以建議我如何以更好的方式做到這一點,如果你想要好?我有一個名爲DatabaseManager的C#類,它處理不同的MySQL查詢(ado.net NET連接器,不是linq或任何類型的ActiveRecord-ish庫)。以C#存儲閱讀器信息#

我做這樣的事情

categories = db_manager.getCategories(); 

的分類列表是相當小的(10個項目),所以我想知道什麼是訪問檢索到的信息,而無需大量額外代碼的最佳方式。

現在我正在使用Struct來存儲信息,但我確信有一個更好的方法來做到這一點。

這裏是我的代碼:

public struct Category 
    { 
     public string name; 
    } 
    internal ArrayList getCategories() 
    { 
     ArrayList categories = new ArrayList(); 

     MySqlDataReader reader; 
     Category category_info; 

     try 
     { 
      conn.Open(); 
      reader = category_query.ExecuteReader(); 
      while (reader.Read()) 
      { 
       category_info = new Category(); 
       category_info.name = reader["name"].ToString(); 
       categories.Add(category_info); 
      } 
      reader.Close(); 
      conn.Close(); 
     } 
     catch (MySqlException e) 
     { 
      Console.WriteLine("ERROR " + e.ToString()); 
     } 

     return categories; 
    } 

回答

4

例:

public IEnumerable<Category> GetCategories() 
{ 
    using (var connection = new MySqlConnection("CONNECTION STRING")) 
    using (var command = new MySqlCommand("SELECT name FROM categories", connection)) 
    { 
     connection.Open(); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return new Category { name = reader.GetString(0) }; 
      } 
     } 
    } 
} 

備註:

  1. 讓ADO.NET連接池做正確的爲你工作(避免存儲連接在靜態字段等)
  2. 始終確保妥善處置非託管資源(使用C#「使用」)
  3. 始終返回從您的公共方法的層次最低的接口(在這種情況下的IEnumerable <範疇>)。
  4. 讓呼叫者處理異常和日誌記錄。這些是橫切問題,不應與您的數據庫訪問代碼混在一起。
0

我會做的第一件事就是更換您使用ArrayList與列表,將您使用的類別列表(提供編譯時類型checkig這樣你就不會在代碼中使用它時必須進行類型轉換)。

-1

從你的代碼我猜你正在使用.NET 1.1,因爲你沒有使用泛型的力量。

1)使用只包含字符串的結構是一種矯枉過正。當一個異常在try塊時只需創建一個字符串數組列表(或使用泛型列表)

2),您留下您的聯繫和Reader中打開...而不是使用這樣的:

try 
{ 
    conn.open(); 
    //more code 
} 
catch (MySqlException e) { // code 
} 
finally { 
    conn.close() 
    if (reader != null) 
     reader.close(); 
} 
+0

-1用於拋出MySqlException,並且不執行使用語句。 – 2009-05-17 20:35:34

+0

它是原始代碼的較短版本。正如你在catch塊中看到的那樣,在實現的其餘部分中有一個名爲「// code」的註釋。 – Gidon 2009-05-25 20:30:34

0

把它們放回來就沒有錯。然而,幾件事情中脫穎而出:

  • 你的catch塊記錄錯誤,但 然後返回一個空數組或一個 部分填充陣列。這 可能不是一個好主意
  • 如果在嘗試 塊中拋出異常,您將不會關閉連接 或丟棄閱讀器。考慮 using()語句。
  • 您應該使用通用類型 (列表<>)而不是ArrayList。