A DataSet
- это структура в памяти - нет прямой связи с SQL или SqlTransaction
.
Я думаю, что вы, вероятно, имеете в виду выполнение операций над сгенерированными TableAdapter
экземплярами с использованием транзакции SQL.
Это сложно.
У Сахиля Малика есть достаточно полный учебник по предмету (да, это действительно "предмет"). По сути, все сводится к расширению TableAdapter
через частичный класс с помощью метода BeginTransaction
, который открывает внутренний SqlConnection
и удерживает его открытым, и возвращает вам SqlTransaction
, который вы затем используете обычным образом. Это громоздко, и вы должны делать это для каждого TableAdapter
. В качестве альтернативы вы можете использовать System.Transactions.TransactionScope
, но вам придется перепрыгивать через различные обручи, чтобы избежать перехода на DTC (распределенная транзакция).
Я бы посоветовал вам взглянуть на связанную статью, а не копировать и вставлять код здесь.
Если у вас много TableAdapters
или, в общем, вам нужно объединить более одной из них в одну транзакцию, подход Sahil не будет масштабироваться слишком хорошо. В прошлом (когда я все еще использовал TableAdapters
) я использовал метод, аналогичный Райану Уитакеру , который в основном был исправлен обезьянами; он использует Reflection для большей части тяжелой работы.
Эти два типа являются определенными ресурсами для обеспечения безопасности кода TableAdapter
. Лично я бы больше не использовал напечатанный DataSet
; теперь это практически устарело, поскольку Linq to SQL и EF существуют, они гораздо более мощные, имеют отложенное выполнение, не полагаются исключительно на структуры в памяти и используют шаблон таблиц Data Gateway + Unit of Work, который очень прост начать работать с транзакциями. По моему опыту, если этого не достаточно, обычно тоже не будет DataSet
, и мне придется опуститься до голых SqlCommand
экземпляров. Но если по какой-то причине вам абсолютно необходимо использовать DataSet
для доступа к данным, вам должен подойти один из двух вышеупомянутых методов.