Хранение информации о читателе в C # - PullRequest
1 голос
/ 17 мая 2009

Я знаю, что то, что я спрашиваю, может не иметь большого смысла для экспертов по C #, но я объясню, что я хочу сделать, а затем вы можете подсказать мне, как сделать это лучше, если вы хотите, хорошо?

У меня есть класс C #, называемый DatabaseManager, который работает с различными запросами 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 ]

4 голосов
/ 18 мая 2009

Пример:

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 голосов
/ 18 мая 2009

Нет ничего плохого в том, чтобы возвращать их таким образом. Тем не менее, несколько вещей выделяются:

  • Ваш блок catch регистрирует ошибку, но затем возвращает либо пустой массив, либо частично заполненный массив. это вероятно, не очень хорошая идея
  • Если при попытке выдается исключение заблокировать не закроешь соединение или распоряжаться читателем. Рассматривать оператор using ().
  • Вы должны использовать общие типы (Список <>) вместо ArrayList.
0 голосов
/ 18 мая 2009

Я полагаю, что из вашего кода вы используете .NET 1.1, потому что вы не используете мощь обобщений.

1) Использование структуры, содержащей только строку, является излишним. Просто создайте массив строк (или с помощью обобщенных списков)

2) Когда в вашем блоке try возникает исключение, вы оставляете соединение и ридер открытым ... Используйте это вместо:

try 
{
   conn.open();
   //more code
}
catch (MySqlException e) { // code
}
finally {
   conn.close()
   if (reader != null)
      reader.close();
}
0 голосов
/ 17 мая 2009

Первое, что я хотел бы сделать, это заменить использование ArrayList на List, который обеспечит проверку типа во время компиляции для использования вами списка категорий (так что вам не нужно будет набирать приведение при использовании его в вашем коде) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...