Страница 395 из 642
namespace AuoLot.Dal.DataOperations
{
public class InventoryDal
{
private readonly string _co
public InventoryDal() : this(
@"Data Source=.,5433;User Id=sa;Password=P@ssw0rd;
Initial Catalog=AutoLot")
{
}
public InventoryDal(string co
=> _co
}
}
Открытие и закрытие подключения
Добавьте переменную уровня класса, которая будет хранить подключение, применяемое кодом доступа к данным. Добавьте также два метода: один для открытия подключения (OpenCo
private SqlCo
private void OpenCo
{
_sqlCo
{
Co
};
_sqlCo
}
private void CloseCo
{
if (_sqlCo
{
_sqlCo
}
}
Ради краткости в большинстве методов класса InventoryDal не будут применяться блоки try/catch для обработки возможных исключений, равно как не будут генерироваться специальные исключения для сообщения о разнообразных проблемах при выполнении (скажем, неправильно сформированная строка подключения). Если бы строилась библиотека доступа к данным производственного уровня, то определенно пришлось бы использовать приемы структурированной обработки исключений (как объяснялось в главе 7), чтобы учесть любые аномалии времени выполнения.
Добавление реализации IDisposable
Добавьте к определению класса интерфейс IDisposable:
public class InventoryDal : IDisposable
{
...
}
Затем реализуйте шаблон освобождения, вызывая Dispose() на объекте SqlCo
bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
_sqlCo
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
Добавление методов выборки
Для начала объедините имеющиеся сведения об объектах команд, чтения данных и обобщенных коллекциях, чтобы получить записи из таблицы Inventory. Как было показано в начале главы, объект чтения данных в поставщике делает возможной выборку записей с использованием механизма, который реализует только чтение в прямом направлении с помощью метода Read(). В этом примере свойство CommandBehavior класса DataReader настроено на автоматическое закрытие подключения, когда закрывается объект чтения данных. Метод GetAllInventory() возвращает экземпляр List<CarViewModel>, представляющий все данные в таблице Inventory:
public List<CarViewModel> GetAllInventory()
{
OpenCo
// Здесь будут храниться записи.
List<CarViewModel> inventory = new List<CarViewModel>();
// Подготовить объект команды.
string sql =
@"SELECT i.Id, i.Color, i.PetName,m.Name as Make
FROM Inventory i
INNER JOIN Makes m on m.Id = i.MakeId";
using SqlCommand command =
new SqlCommand(sql, _sqlCo
{
CommandType = CommandType.Text
};
command.CommandType = CommandType.Text;
SqlDataReader dataReader =
command.ExecuteReader(CommandBehavior.CloseCo
while (dataReader.Read())