Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Value = car.PetName, SqlDbType = SqlDbType. NVarChar, Size = 50, Direction = ParameterDirection.Input }; command.Parameters.Add(parameter); command.ExecuteNonQuery(); CloseConnection(); }}В то время как построение параметризированного запроса часто требует большего объема кода, в результате получается более удобный способ для программной настройки операторов SQL и достигается лучшая производительность. Параметризированные запросы также чрезвычайно удобны, когда нужно запускать хранимые процедуры.
Выполнение хранимой процедуры
Вспомните, что хранимая процедура представляет собой именованный блок кода SQL, сохраненный в базе данных. Хранимые процедуры можно конструировать так, чтобы они возвращали набор строк либо скалярных типов данных или выполняли еще какие-то осмысленные действия (например, вставку, обновление или удаление записей); в них также можно предусмотреть любое количество необязательных параметров. Конечным результатом будет единица работы, которая ведет себя подобно типичной функции, но только находится в хранилище данных, а не в двоичном бизнес-объекте. В текущий момент в базе данных
AutoLotGetPetNameРассмотрим следующий (пока что) финальный метод типа
InventoryDalGetPetNamepublic 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); // Выходной параметр. param = new SqlParameter { ParameterName = "@petName", SqlDbType = SqlDbType.NVarChar, Size = 50, Direction = ParameterDirection.Output }; command.Parameters.Add(param); // Выполнить хранимую процедуру. command.ExecuteNonQuery(); // Возвратить выходной параметр. carPetName = (string)command.Parameters["@petName"].Value; CloseConnection(); } return carPetName;}С вызовом хранимых процедур связан один важный аспект: объект команды может представлять оператор SQL (по умолчанию) либо имя хранимой процедуры. Когда объекту команды необходимо сообщить о том, что он будет вызывать хранимую процедуру, потребуется указать имя этой процедуры (в аргументе конструктора или в свойстве
CommandTextCommandTypeCommandType.StoredProcedureДалее обратите внимание, что свойство
Direction@petNameParameterDirection.OutputПосле того, как хранимая процедура, запущенная вызовом метода
ExecuteNonQuery()// Возвратить выходной параметр.carPetName = (string)command.Parameters["@petName"].Value;К настоящему моменту вы располагаете простейшей библиотекой доступа к данным, которую можно задействовать при построении клиента для отображения и редактирования данных. Вопросы создания графических пользовательских интерфейсов пока не обсуждались, поэтому мы протестируем полученную библиотеку доступа к данным с помощью нового консольного приложения.
Создание консольного клиентского приложения
Добавьте к решению
AutoLot.DalAutoLot.ClientAutoLot.DaldotnetChapter21_А11Projects.sindotnet new console -lang c# -n AutoLot.Client -o .AutoLot.Client -f net5.0dotnet sln .Chapter21_AllProjects.sln add .AutoLot.Clientdotnet add AutoLot.Client package Microsoft.Data.SqlClientdotnet add AutoLot.Client reference AutoLot.DalВ случае использования Visual Studio щелкните правой кнопкой мыши на имени решения и выберите в контекстном меню пункт Add►New Project (Добавить►Новый проект). Установите новый проект в качестве стартового (щелкнув правой кнопкой мыши на имени проекта в окне Solution Explorer и выбрав в контекстном меню пункт Set as Startup Project (Установить как стартовый проект)). Это обеспечит запуск нового проекта при инициировании отладки в Visual Studio. Если вы применяете Visual Studio Code, тогда перейдите в каталог
AutoLot.Testdotnet run