Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 258 259 260 261 262 263 264 265 266 ... 407
Перейти на страницу:
объекта команды:

command.Parameters.Add(paramId);

command.Parameters.Add(paramName);

Обновление метода InsertAuto()

Добавьте следующую версию метода InsertAuto(), чтобы задействовать объекты параметров:

public void InsertAuto(Car car)

{

  OpenConnection();

  // Обратите внимание на "заполнители" в запросе SQL.

  string sql = "Insert Into Inventory" +

    "(MakeId, Color, PetName) Values" +

    "(@MakeId, @Color, @PetName)";

  // Эта команда будет иметь внутренние параметры.

  using (SqlCommand command = new SqlCommand(sql, _sqlConnection))

  {

    // Заполнить коллекцию параметров.

    SqlParameter parameter = new SqlParameter

    {

      ParameterName = "@MakeId",

      Value = car.MakeId,

      SqlDbType = SqlDbType.Int,

      Direction = ParameterDirection.Input

    };

    command.Parameters.Add(parameter);

    parameter = new SqlParameter

    {

      ParameterName = "@Color",

      Value = car.Color,

      SqlDbType = SqlDbType. NVarChar,

      Size = 50,

      Direction = ParameterDirection.Input

    };

    command.Parameters.Add(parameter);

    parameter = new SqlParameter

    {

      ParameterName = "@PetName",

      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);

    // Выходной параметр.

    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 (по умолчанию) либо имя хранимой процедуры. Когда объекту команды необходимо сообщить о том, что он будет вызывать хранимую процедуру, потребуется указать имя этой процедуры (в аргументе конструктора или в свойстве 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 щелкните правой кнопкой мыши на имени решения и выберите в контекстном меню пункт AddNew Project (Добавить►Новый проект). Установите новый проект в качестве стартового (щелкнув правой кнопкой мыши на имени проекта в окне Solution Explorer и выбрав в контекстном меню пункт Set as Startup Project (Установить как стартовый проект)). Это обеспечит запуск нового проекта при инициировании отладки в Visual Studio. Если вы применяете Visual Studio Code, тогда перейдите в каталог AutoLot.Test и запустите проект (когда наступит время) с использованием dotnet run.

Очистите код, сгенерированный в Program.cs, и поместите в начало файла Program.cs следующие операторы using:

using System;

using System.Linq;

using AutoLot.Dal;

using AutoLot.Dal.Models;

using AutoLot.Dal.DataOperations;

using System.Collections.Generic;

Чтобы задействовать AutoLot.Dal, замените код метода Main() показанным далее кодом:

InventoryDal dal = new InventoryDal();

List<CarViewModel> list = dal.GetAllInventory();

Console.WriteLine(" ************** All Cars ************** ");

Console.WriteLine("IdtMaketColortPet Name");

foreach (var itm in list)

{

  Console.WriteLine($"{itm.Id}t{itm.Make}t{itm.Color}t{itm.PetName}");

}

Console.WriteLine();

CarViewModel car =

  dal.GetCar(list.OrderBy(x=>x.Color).Select(x => x.Id).First());

Console.WriteLine(" ************** First Car By Color ************** ");

Console.WriteLine("CarIdtMaketColortPet Name");

Console.WriteLine($"{car.Id}t{car.Make}t{car.Color}t{car.PetName}");

try

{

  // Это потерпит неудачу из-за наличия связанных данных в таблице Orders.

  dal.DeleteCar(5);

  Console.WriteLine("Car deleted."); // Запись об автомобиле удалена.

1 ... 258 259 260 261 262 263 264 265 266 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?