我知道我的问题可能对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;
}
答案 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 :(得分:0)
我要做的第一件事是替换你使用ArrayList和List,它将为你使用类别列表提供编译时类型checkig(所以你不必在你的代码中使用它时输入它)
答案 2 :(得分:0)
以这样的方式返回它们并没有错。但是,有一些事情很突出:
答案 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();
}