在C#中存储读者信息

时间:2009-05-17 19:54:45

标签: c# .net mysql database

我知道我的问题可能对C#专家没有多大意义,但我会解释我想做什么然后你可以建议我如果你想要更好的方式做到这一点?

我有一个名为DatabaseManager的C#类,它处理不同的MySQL查询(ado.net NET连接器,而不是linq或任何类型的ActiveRecord-ish库)。

我正在做类似

的事情
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 个答案:

答案 0 :(得分: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#中使用“using”)
  3. 始终从公共方法返回层次结构中的最低接口(在本例中为IEnumerable&lt; Category&gt;)。
  4. 让调用者处理异常和日志记录。这些是横切关注点,不应与您的数据库访问代码混合使用。

答案 1 :(得分:0)

我要做的第一件事是替换你使用ArrayList和List,它将为你使用类别列表提供编译时类型checkig(所以你不必在你的代码中使用它时输入它)

答案 2 :(得分:0)

以这样的方式返回它们并没有错。但是,有一些事情很突出:

  • 您的catch块会记录错误但是 然后返回一个空数组或 部分填充的数组。这个 可能不是个好主意
  • 如果在try中抛出异常 阻止你不会关闭连接 或处置读者。考虑 using()语句。
  • 您应该使用泛型类型 (List&lt;&gt;)而不是ArrayList。

答案 3 :(得分:-1)

从您的代码中我猜您使用的是.NET 1.1,因为您没有使用泛型的功能。

1)使用仅包含字符串的结构是一种过度杀伤力。只需创建一个字符串的arraylist(或使用泛型列表)

2)当你的try块发生异常时,你的连接和阅读器都会打开......请改用它:

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