2009-05-17 83 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。