Должен ли я удалить свой класс SQL или улучшить его? C# - PullRequest
1 голос
/ 28 апреля 2020

У меня есть класс, в котором хранится фрагмент кода, который я обычно использую для запросов SQL.

Например, я использую этот метод для заполнения datagridviews.Datasource такими вещами, как продукты, поставщики, клиенты и любые данные, которые мне нужны в таблице:

public DataTable GetDataTable(string query)
{
    using (SqlConnection _connection = new SqlConnection(ConnectionString))
    {
        _connection.Open();

        using (SqlDataAdapter adapter = new SqlDataAdapter(query, _connection))
        {
            DataTable dt = new DataTable();
            adapter.Fill(dt);

            return dt;
        }
    }
}

У меня есть похожие вещи для Команды и читатели. Единственная проблема заключалась в том, что с читателями я заполнял list<string> первой записью в SqlDataReader, поэтому мне приходилось запускать читателей вне класса, чтобы иметь дело с такими вещами, как комбинированные списки. Пытаясь решить эту проблему, я начал думать, что может быть лучше просто поместить код для запросов, где он мне нужен, а не создавать новый метод ExecuteReader для запуска метода Data.SqlClient ExecuteReader.

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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Если вам нужен метод, который возвращает типизированный список с данными из базы данных, вы можете сделать это:

public List<T> GetList<T>(string query, Func<SqlDataReader, T> func)
{
    var list = new List<T>();

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();

        using (var sqlCommand = new SqlCommand(query, connection))
        using (var reader = sqlCommand.ExecuteReader())
        {
            while (reader.Read())
            {
                var item = func(reader);
                list.Add(item);
            }
        }
    }

    return list;
}

То есть установить метод для создания и заполнения объекта как лямбда-функции .
Используйте это так:

var departments = GetList<Department>(
    "select Id, Name from Department",
    reader => new Department(reader.GetInt32(0), reader.GetString(1)) // using constructor
);

var orders = GetList<Order>(
    "select Id, Price, Date from Order",
    reader => new Order // using properties
    {
        Id = reader.GetInt32(0),
        Price = reader.GetDecimal(1),
        Date = reader.GetDateTime(2)
    }
);

и т. Д.

0 голосов
/ 28 апреля 2020

Я тоже сделал подобное в своих приложениях, чтобы иметь централизованное место для отправки моих запросов, получения сообщений об ошибках в случае сбоя и возврата данных. С тех пор я перешел к запросам строго типизированных наборов результатов, но предпосылка та же.

Чтобы расширить то, что у вас есть, вы можете захотеть еще раз обернуть его, разрешив передать полную команду SQLCommand. в котором может быть параметризован. Вы не хотите просто объединять строку вместе с ...

sqlCmd.CommandText = "select .. from .. where x = " + SomeVariableFromUncontrolledSource;

Вы бы просили SQL Инъекция.

public DataTable GetDataTable(string query)
{
   var sqlcmd = new SqlCommand( query );
   return GetDataTable( sqlcmd );
}

public DataTable GetDataTable(SqlCommand sqlcmd)
{
   using (SqlConnection _connection = new SqlConnection(ConnectionString))
   {
      _connection.Open();
      using (SqlDataAdapter adapter = new SqlDataAdapter(sqlcmd, _connection))
      {
         DataTable dt = new DataTable();
         adapter.Fill(dt);
         return dt;
      }
   }
}

Опять же, вы, вероятно, хотите попробовать / перехватить такое плохое sql соединение, плохая команда запроса, неверные параметры, плохое чтение и т. д. c ... Но есть преимущество, что он централизован и не дублирует открытое, закрытое соединение, попробуйте / ошибки ловушки тоже. И перегрузив функцию, чтобы разрешить простую строку ИЛИ полностью подготовленную SqlCommand, вы оба идете в одно и то же центральное место.

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