 <p>Here is a way to extend transactional functionality to your typed dataset. You could alter this to include your special SQLCommand wrappers.</p> <p>In this example, I have a dataset called "dsMain" and a few direct queries in a "QueriesTableAdapter". I extend the partial class for the TableAdapter with a function that will create a transaction based on the first (0) connection and then apply it to every connection in the table adapter.</p> <pre><code>Namespace dsMainTableAdapters Partial Public Class QueriesTableAdapter Public Function CreateTransaction() As Data.IDbTransaction Dim oConnection = Me.CommandCollection(0).Connection oConnection.Open() Dim oTrans = oConnection.BeginTransaction() For Each cmd In Me.CommandCollection cmd.Connection = oConnection cmd.Transaction = oTrans Next Return oTrans End Function End Class End Namespace </code></pre> <p>You begin the transaction by calling the new function</p> <pre><code>Dim qa As New dsMainTableAdapters.QueriesTableAdapter Dim oTrans = qa.CreateTransaction() </code></pre> <p>Then you can call TableAdapter queries within your transaction</p> <pre><code>qa.Query1 qa.Query2 </code></pre> <p>When you are done with your queries you commit the transaction</p> <pre><code>oTrans.Commit() </code></pre> <p>You can do the same thing for any TableAdapter that was created for your datasets. If you have multiple TableAdapters that need to use the same transaction, then in addition to a "CreateTransaction" you should make a "SetTransaction" and have the Transaction be a parameter.</p>