Категории
Самые читаемые
ChitatKnigi.com » 🟢Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

Читать онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
1 ... 398 399 400 401 402 403 404 405 406 ... 642
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать

    Direction = ParameterDirection.Input

  };

  cmdInsert.Parameters.Add(parameterId2);

  cmdInsert.Parameters.Add(parameterFirstName);

  cmdInsert.Parameters.Add(parameterLastName);

  // Это будет получено из объекта подключения.

  SqlTransaction tx = null;

  try

  {

    tx = _sqlConnection.BeginTransaction();

    // Включить команды в транзакцию.

    cmdInsert.Transaction = tx;

    cmdUpdate.Transaction = tx;

    // Выполнить команды.

    cmdInsert.ExecuteNonQuery();

    cmdUpdate.ExecuteNonQuery();

    // Эмулировать ошибку.

    if (throwEx)

    {

      throw new Exception("Sorry!  Database error! Tx failed...");

      // Возникла ошибка, связанная с базой данных! Отказ транзакции...

    }

    // Зафиксировать транзакцию!

    tx.Commit();

  }

  catch (Exception ex)

  {

    Console.WriteLine(ex.Message);

    // Любая ошибка приведет к откату транзакции.

    // Использовать условную операцию для проверки на предмет null.

    tx?.Rollback();

  }

  finally

  {

    CloseConnection();

  }

}

Здесь используется входной параметр типа bool, который указывает, нужно ли генерировать произвольное исключение при попытке обработки проблемного клиента. Такой прием позволяет эмулировать непредвиденные обстоятельства, которые могут привести к неудачному завершению транзакции. Понятно, что это делается лишь в демонстрационных целях; настоящий метод транзакции не должен позволять вызывающему процессу нарушать работу логики по своему усмотрению!

Обратите внимание на применение двух объектов SqlCommand для представления каждого шага транзакции, которая будет запущена. После получения имени и фамилии клиента на основе входного параметра customerID с помощью метода BeginTransaction() объекта подключения можно получить допустимый объект SqlTransaction. Затем (что очень важно) потребуется привлечь к участию каждый объект команды, присвоив его свойству Transaction полученного объекта транзакции. Если этого не сделать, то логика вставки и обновления не будет находиться в транзакционном контексте.

После вызова метода ExecuteNonQuery() на каждой команде генерируется исключение, если (и только если) значение параметра bool равно true. В таком случае происходит откат всех ожидающих операций базы данных. Если исключение не было сгенерировано, тогда в результате вызова Commit() оба шага будут зафиксированы в таблицах базы данных.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Тестирование транзакции базы данных

Выберите одного из клиентов, добавленных в таблицу Customers (например, Dave Benner, Id = 1). Добавьте в Program.cs внутри проекта AutoLot.Client новый метод по имени FlagCustomer():

void FlagCustomer()

{

  Console.WriteLine("***** Simple Transaction Example *****n");

  // Простой способ позволить транзакции успешно завершиться или отказать.

  bool throwEx = true;

  Console.Write("Do you want to throw an exception (Y or N): ");

              // Хотите ли вы сгенерировать исключение?

  var userAnswer = Console.ReadLine();

   if (string.IsNullOrEmpty(userAnswer) ||

       userAnswer.Equals("N",StringComparison.OrdinalIgnoreCase))

  {

    throwEx = false;

  }

  var dal = new InventoryDal();

  // Обработать клиента 1 - ввести идентификатор клиента,

  // подлежащего перемещению.

  dal.ProcessCreditRisk(throwEx, 1);

  Console.WriteLine("Check CreditRisk table for results");

                  // Результаты ищите в таблице CreditRisk

  Console.ReadLine();

}

Если вы запустите программу и укажете на необходимость генерации исключения, то обнаружите, что фамилия клиента в таблице Customers не изменилась, т.к. произошел откат всей транзакции. Однако если исключение не генерировалось, тогда окажется, что фамилия клиента в таблице Customers изменилась и была добавлена в таблицу CreditRisks.

Выполнение массового копирования с помощью ADO.NET

В случае, когда необходимо загрузить много записей в базу данных, показанные до сих пор методы будут довольно неэффективными. В SQL Server имеется средство, называемое массовым копированием, которое предназначено специально для таких сценариев, и в ADO.NET для него предусмотрена оболочка в виде класса SqlBulkCopy. В настоящем разделе главы объясняется, как выполнять массовое копирование с помощью ADO.NET.

1 ... 398 399 400 401 402 403 404 405 406 ... 642
Перейти на страницу:
Отывы о книге
Открыть боковую панель
Комментарии
Ксения
Ксения 25.01.2025 - 12:30
Неплохая подборка книг. Прочитаю все однозначно.
Jonna
Jonna 02.01.2025 - 01:03
Страстно🔥 очень страстно
Ксения
Ксения 20.12.2024 - 00:16
Через чур правильный герой. Поэтому и остался один
Настя
Настя 08.12.2024 - 03:18
Прочла с удовольствием. Необычный сюжет с замечательной концовкой
Марина
Марина 08.12.2024 - 02:13
Не могу понять, где продолжение... Очень интересная история, хочется прочесть далее