Выберите одного из клиентов, добавленных в таблицу 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.

<p id="AutBody_Root869"><strong>Выполнение массового копирования с помощью ADO.NET</strong></p>

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

<p id="AutBody_Root870"><strong>Исследование класса SqlBulkCopy</strong></p>

Класс SqlBulkCopy имеет один метод, WriteToServer() (и его асинхронную версию WriteToServerAsync()), который обрабатывает список записей и помещает данные в базу более эффективно, чем последовательность операторов Insert, выполненная с помощью объектов команд. Метод WriteToServer() перегружен, чтобы принимать объект DataTable, объект DataReader или массив объектов DataRow. Придерживаясь тематики главы, мы собираемся использовать версию WriteToServer(), которая принимает DataReader, так что необходимо создать специальный класс чтения данных.

<p id="AutBody_Root871"><strong>Создание специального класса чтения данных</strong></p>

Желательно, чтобы специальный класс чтения данных был обобщенным и содержал список моделей, которые нужно импортировать. Создайте в проекте AutoLot.DAL новую папку по имени BulkImport, a в ней — новый файл интерфейса IMyDataReader.cs, реализующего IDataReader, со следующим кодом:

using System.Collections.Generic;

using System.Data;

namespace AutoLot.Dal.BulkImport

{

  public interface IMyDataReader : IDataReader

  {

    List Records { get; set; }

  }

}

Далее реализуйте специальный класс чтения данных. Как вы уже видели, классы чтения данных содержат много частей, отвечающих за перемещение данных. Хорошая новость в том, что для SqlBulkCopy придется реализовать лишь несколько из них. Создайте новый файл класса по имени MyDataReader.cs и добавьте в него перечисленные ниже операторы using:

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Reflection;

Сделайте класс открытым и запечатанным и обеспечьте реализацию классом интерфейса IMyDataReader. Добавьте конструктор для принятия записей и установки свойства:

public sealed class MyDataReader : IMyDataReader

{

  public List Records { get; set; }

  public MyDataReader(List records)

  {

    Records = records;

  }

}

Перейти на страницу:

Похожие книги