Я следую онлайн-курсу, и в ходе курса они объясняют, как вы можете получать данные из базы данных. Создание соединения и команд осуществляется классом 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;
}
Почему вы думаете, что для этого потребуется много копий. Сначала вы должны передать в CommandText переменную/параметр, чтобы какой-либо метод, который вы решили использовать для «кода для повторного использования», меняет метод подпись для обработки таких вещей, как SqlCommand, SqlParameter и т. д. Использование операторов для автоматического удаления объектов, попробуйте использовать «MSDN» и еще несколько исследований на вашем конце, чтобы вы могли понять вне онлайн-класса, как все работает в реальном мире. – MethodMan
также есть и более простые способы сделать то, что вы пытаетесь сделать в своем собственном классе DBUtils. – MethodMan
вы могли бы исключить цикл while здесь и для пользователя метод 'DataAdapter.FIll()', чтобы вернуть содержимое в 'DataTable', ваш код нуждается в каком-то серьезном« Re-Factoring » – MethodMan