Шрифт:
Интервал:
Закладка:
Value = car.PetName,
SqlDbType = SqlDbType. NVarChar,
Size = 50,
Direction = ParameterDirection.Input
};
command.Parameters.Add(parameter);
command.ExecuteNonQuery();
CloseConnection();
}
}
В то время как построение параметризированного запроса часто требует большего объема кода, в результате получается более удобный способ для программной настройки операторов SQL и достигается лучшая производительность. Параметризированные запросы также чрезвычайно удобны, когда нужно запускать хранимые процедуры.
Выполнение хранимой процедуры
Вспомните, что хранимая процедура представляет собой именованный блок кода SQL, сохраненный в базе данных. Хранимые процедуры можно конструировать так, чтобы они возвращали набор строк либо скалярных типов данных или выполняли еще какие-то осмысленные действия (например, вставку, обновление или удаление записей); в них также можно предусмотреть любое количество необязательных параметров. Конечным результатом будет единица работы, которая ведет себя подобно типичной функции, но только находится в хранилище данных, а не в двоичном бизнес-объекте. В текущий момент в базе данных AutoLot определена единственная хранимая процедура по имени GetPetName.
Рассмотрим следующий (пока что) финальный метод типа InventoryDal, в котором вызывается хранимая процедура GetPetName:
public string LookUpPetName(int carId)
{
OpenConnection();
string carPetName;
// Установить имя хранимой процедуры.
using (SqlCommand command = new SqlCommand("GetPetName", _sqlConnection))
{
command.CommandType = CommandType.StoredProcedure;
// Входной параметр.
SqlParameter param = new SqlParameter
{
ParameterName = "@carId",
SqlDbType = SqlDbType.Int,
Value = carId,
Direction = ParameterDirection.Input
};
command.Parameters.Add(param);
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})// Выходной параметр.
param = new SqlParameter
{
ParameterName = "@petName",
SqlDbType = SqlDbType.NVarChar,
Size = 50,
Direction = ParameterDirection.Output
};
command.Parameters.Add(param);
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})// Выполнить хранимую процедуру.
command.ExecuteNonQuery();
// Возвратить выходной параметр.
carPetName = (string)command.Parameters["@petName"].Value;
CloseConnection();
}
return carPetName;
}
С вызовом хранимых процедур связан один важный аспект: объект команды может представлять оператор SQL (по умолчанию) либо имя хранимой процедуры. Когда объекту команды необходимо сообщить о том, что он будет вызывать хранимую процедуру, потребуется указать имя этой процедуры (в аргументе конструктора или в свойстве CommandText) и установить свойство CommandType в CommandType.StoredProcedure. (В противном случае возникнет исключение времени выполнения, т.к. по умолчанию объект команды ожидает оператор SQL.)
Далее обратите внимание, что свойство Direction параметра @petName установлено в ParameterDirection.Output. Как и ранее, все объекты параметров добавляются в коллекцию параметров объекта команды.
После того, как хранимая процедура, запущенная вызовом метода ExecuteNonQuery(), завершила работу, можно получить значение выходного параметра, просмотрев коллекцию параметров объекта команды и применив соответствующее приведение:
// Возвратить выходной параметр.
carPetName = (string)command.Parameters["@petName"].Value;
К настоящему моменту вы располагаете простейшей библиотекой доступа к данным, которую можно задействовать при построении клиента для отображения и редактирования данных. Вопросы создания графических пользовательских интерфейсов пока не обсуждались, поэтому мы протестируем полученную библиотеку доступа к данным с помощью нового консольного приложения.
Создание консольного клиентского приложения
Добавьте к решению AutoLot.Dal новый проект консольного приложения (по имени AutoLot.Client) и ссылку на проект AutoLot.Dal. Ниже приведены соответствующие CLI-команды dotnet (предполагается, что ваше решение называется Chapter21_А11Projects.sin):
dotnet new console -lang c# -n AutoLot.Client -o .AutoLot.Client -f net5.0
dotnet sln .Chapter21_AllProjects.sln add .AutoLot.Client
dotnet add AutoLot.Client package Microsoft.Data.SqlClient
dotnet add AutoLot.Client reference AutoLot.Dal
В случае использования Visual Studio щелкните правой кнопкой мыши на имени решения и выберите в контекстном меню пункт Add►New Project (Добавить►Новый проект). Установите новый проект в качестве стартового (щелкнув правой кнопкой мыши на имени проекта в окне Solution Explorer и выбрав в контекстном меню пункт Set as Startup Project (Установить как стартовый проект)). Это обеспечит запуск нового проекта при инициировании отладки в Visual Studio. Если вы применяете Visual Studio Code, тогда перейдите в каталог AutoLot.Test и запустите проект (когда наступит время) с использованием dotnet run.
- Понимание SQL - Мартин Грубер - Базы данных