Обратите внимание на применение двух объектов SqlCommand
customerID с помощью метода BeginTransaction объекта подключения можно получить допустимый объект SqlTransaction. Затем (что очень важно) потребуется Transaction полученного объекта транзакции. Если этого не сделать, то логика вставки и обновления не будет находиться в транзакционном контексте.После вызова метода ExecuteNonQuery
bool равно true. В таком случае происходит откат всех ожидающих операций базы данных. Если исключение не было сгенерировано, тогда в результате вызова Commit оба шага будут зафиксированы в таблицах базы данных.Тестирование транзакции базы данных
Выберите одного из клиентов, добавленных в таблицу 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 имеется средство, называемое
SqlBulkCopy. В настоящем разделе главы объясняется, как выполнять массовое копирование с помощью ADO.NET.Исследование класса SqlBulkCopy
Класс SqlBulkCopy
WriteToServer (и его асинхронную версию WriteToServerAsync), который обрабатывает список записей и помещает данные в базу более эффективно, чем последовательность операторов Insert, выполненная с помощью объектов команд. Метод WriteToServer перегружен, чтобы принимать объект DataTable, объект DataReader или массив объектов DataRow. Придерживаясь тематики главы, мы собираемся использовать версию WriteToServer, которая принимает DataReader, так что необходимо создать специальный класс чтения данных.Создание специального класса чтения данных
Желательно, чтобы специальный класс чтения данных был обобщенным и содержал список моделей, которые нужно импортировать. Создайте в проекте AutoLot.DAL
BulkImport, a в ней — новый файл интерфейса IMyDataReader.cs, реализующего IDataReader, со следующим кодом:using System.Collections.Generic;
using System.Data;
namespace AutoLot.Dal.BulkImport
{
public interface IMyDataReader
{
List
}
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT