Язык программирования C#9 и платформа .NET5
Часть 395 из 642 Информация о книге
namespace AuoLot.Dal.DataOperations{public class InventoryDal{private readonly string _connectionString;public InventoryDal() : this(@"Data Source=.,5433;User Id=sa;Password=P@ssw0rd;Initial Catalog=AutoLot"){}public InventoryDal(string connectionString)=> _connectionString = connectionString;}}Открытие и закрытие подключения
Добавьте переменную уровня класса, которая будет хранить подключение, применяемое кодом доступа к данным. Добавьте также два метода: один для открытия подключения
) и еще один для закрытия подключения ((OpenConnection()). В методеCloseConnection()проверьте состояние подключения и если оно не закрыто, тогда вызовите методCloseConnection()на объекте подключения. Вот как выглядит код:Close()private SqlConnection _sqlConnection = null;private void OpenConnection(){_sqlConnection = new SqlConnection{ConnectionString = _connectionString};_sqlConnection.Open();}private void CloseConnection(){if (_sqlConnection?.State != ConnectionState.Closed){_sqlConnection?.Close();}}Ради краткости в большинстве методов класса
не будут применяться блокиInventoryDalдля обработки возможных исключений, равно как не будут генерироваться специальные исключения для сообщения о разнообразных проблемах при выполнении (скажем, неправильно сформированная строка подключения). Если бы строилась библиотека доступа к данным производственного уровня, то определенно пришлось бы использовать приемы структурированной обработки исключений (как объяснялось в главе 7), чтобы учесть любые аномалии времени выполнения.try/catchДобавление реализации IDisposable
Добавьте к определению класса интерфейс
:IDisposablepublic class InventoryDal : IDisposable{...}Затем реализуйте шаблон освобождения, вызывая
на объектеDispose():SqlConnectionbool _disposed = false;protected virtual void Dispose(bool disposing){if (_disposed){return;}if (disposing){_sqlConnection.Dispose();}_disposed = true;}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}Добавление методов выборки
Для начала объедините имеющиеся сведения об объектах команд, чтения данных и обобщенных коллекциях, чтобы получить записи из таблицы
. Как было показано в начале главы, объект чтения данных в поставщике делает возможной выборку записей с использованием механизма, который реализует только чтение в прямом направлении с помощью методаInventory. В этом примере свойствоRead()классаCommandBehaviorнастроено на автоматическое закрытие подключения, когда закрывается объект чтения данных. МетодDataReaderвозвращает экземплярGetAllInventory(), представляющий все данные в таблицеList<CarViewModel>:Inventorypublic List<CarViewModel> GetAllInventory(){OpenConnection();// Здесь будут храниться записи.List<CarViewModel> inventory = new List<CarViewModel>();// Подготовить объект команды.string sql =@"SELECT i.Id, i.Color, i.PetName,m.Name as MakeFROM Inventory iINNER JOIN Makes m on m.Id = i.MakeId";using SqlCommand command =new SqlCommand(sql, _sqlConnection){CommandType = CommandType.Text};command.CommandType = CommandType.Text;SqlDataReader dataReader =command.ExecuteReader(CommandBehavior.CloseConnection);while (dataReader.Read())