2015-11-13 7 views
0

Я следую онлайн-курсу, и в ходе курса они объясняют, как вы можете получать данные из базы данных. Создание соединения и команд осуществляется классом DbProviderFactories. Я понимаю код в курсе, но использует using для подключения, команды и читателя? Кроме того, необходимы нулевые проверки? Код выглядит загроможденным, и если у вас много моделей в вашей базе данных (Continent, Country, Currency, ...), для этого потребуется много копий/пасты, что плохо?Подключение к базе данных по курсу, которое я следую

Итак, на самом деле вопрос, является ли приведенный ниже код хорошим или плохим и что можно улучшить? Целью является использование SQLite в качестве поставщика баз данных. Означает ли это, что подход ниже?

public static ObservableCollection<Continent> GetContinents() 
{ 
    var continents = new ObservableCollection<Continent>(); 
    var provider = ConfigurationManager.ConnectionStrings["DbConnection"].ProviderName; 
    var connectionString = ConfigurationManager.ConnectionStrings["DbConnection"].ConnectionString; 

    using (var connection = DbProviderFactories.GetFactory(provider).CreateConnection()) 
    { 
     if (connection == null) return null; 

     connection.ConnectionString = connectionString; 
     connection.Open(); 

     using (var command = DbProviderFactories.GetFactory(provider).CreateCommand()) 
     { 
      if (command == null) return null; 

      command.CommandType = CommandType.Text; 
      command.Connection = connection; 
      command.CommandText = "SELECT * FROM Continent"; 

      using (var reader = command.ExecuteReader()) 
       while (reader.Read()) 
        continents.Add(new Continent(reader["Code"].ToString(), reader["EnglishName"].ToString())); 
     } 
    } 

    return continents; 
} 
+0

Почему вы думаете, что для этого потребуется много копий. Сначала вы должны передать в CommandText переменную/параметр, чтобы какой-либо метод, который вы решили использовать для «кода для повторного использования», меняет метод подпись для обработки таких вещей, как SqlCommand, SqlParameter и т. д. Использование операторов для автоматического удаления объектов, попробуйте использовать «MSDN» и еще несколько исследований на вашем конце, чтобы вы могли понять вне онлайн-класса, как все работает в реальном мире. – MethodMan

+0

также есть и более простые способы сделать то, что вы пытаетесь сделать в своем собственном классе DBUtils. – MethodMan

+0

вы могли бы исключить цикл while здесь и для пользователя метод 'DataAdapter.FIll()', чтобы вернуть содержимое в 'DataTable', ваш код нуждается в каком-то серьезном« Re-Factoring » – MethodMan

ответ

1

используя использование для связи, команда и считыватель необходимо?

Да. Здесь я комментировал код

using (var command = DbProviderFactories.GetFactory(provider).CreateCommand()) // here you've created the command 
 
      { 
 
       if (command == null) return null; 
 

 
       command.CommandType = CommandType.Text; 
 
       command.Connection = connection; 
 
       command.CommandText = "SELECT * FROM Continent"; 
 

 
       using (var reader = command.ExecuteReader()) //Here you're reading what the command returned. 
 
        while (reader.Read()) 
 
         continents.Add(new Continent(reader["Code"].ToString(), reader["EnglishName"].ToString())); 
 
      }

Кроме того, есть нулевые чеки необходимо?

Это может возвращать нулевые данные так да абсолютно

Код выглядит загроможденной

Такова жизнь кодировщик Brotha. Использование циклов для объектов будет экономить место.

+0

. Какова цель того, что вы разместили здесь как« НЕ-ОТВЕТ », копируя его код, на самом деле не помогает, на мой взгляд, комментарии могли бы объяснить это не переписывая неуклюжий код – MethodMan

+0

@MethodMan прокрутите направо чувак. Я сделал комментарии. пожалуйста, +1, чтобы компенсировать ваше недоразумение: p –