C# 用C语言存储阅读器信息

C# 用C语言存储阅读器信息,c#,.net,mysql,database,C#,.net,Mysql,Database,我知道我的要求对C专家来说可能没有多大意义,但我会解释我想做什么,然后你可以建议我如何以更好的方式来做,如果你愿意的话,好吗 我有一个名为DatabaseManager的C类,它处理不同的MySQL查询ado.net连接器,而不是linq或任何类型的ActiveRecord库 我在做类似的事情 categories = db_manager.getCategories(); 类别列表非常小,只有10项,因此我想知道在没有大量额外代码的情况下访问检索到的信息的最佳方式是什么 现在我正在使用结构来

我知道我的要求对C专家来说可能没有多大意义,但我会解释我想做什么,然后你可以建议我如何以更好的方式来做,如果你愿意的话,好吗

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

我在做类似的事情

categories = db_manager.getCategories();
类别列表非常小,只有10项,因此我想知道在没有大量额外代码的情况下访问检索到的信息的最佳方式是什么

现在我正在使用结构来存储信息,但我相信有更好的方法来实现这一点

这是我的密码:

    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;
    }

我要做的第一件事是将ArrayList的使用替换为List,它将为您使用category List提供编译时类型检查,这样您在代码中使用它时就不必进行类型转换。

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

1使用只包含字符串的结构是一种过度使用。只需创建字符串的arraylist或使用泛型创建列表

2当您的try块中发生异常时,您将保持连接和读卡器处于打开状态。。。改用这个:

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

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) };
            }
        }
    }
}
备注:

让ADO.NET连接池为您做正确的工作,避免将连接存储在静态字段中等。。。 始终确保在C中使用正确地处置非托管资源 在本例中,始终从公共方法返回层次结构中最低的接口IEnumerable。 让调用方处理异常和日志记录。这些是横切关注点,不应与DB访问代码混合使用。
以这样的方式归还它们没有什么错。然而,有几件事很突出:

catch块记录错误,但是 然后返回空数组或 部分填充的数组。这 可能不是个好主意 如果在try中抛出异常 阻止您将不会关闭连接 或者丢弃读卡器。考虑 using语句。 您应该使用泛型类型 列表而不是ArrayList。
您可能应该在try/catch子句中总结这一切,以坚持将错误打印到控制台的初衷。这真的很好。我试试看。然而,我想问。。。您的解决方案是否意味着我仍然必须使用我的类别结构?或者我可以使用其他方法来避免映射变量吗?例如:名称中的一部分,我想检索id和任何变量。我是否总是需要将属性添加到结构并创建赋值?再次感谢:-1放弃了MySqlException,并且没有使用语句实现。这是原始代码的较短版本。正如您在catch块中所看到的,有一个名为//code的注释,其中包含了实现的其余部分。