如何使用添加连接向导创建的DataSet添加事务?

时间:2010-04-16 10:18:52

标签: asp.net sql sql-server visual-studio-2010 transactions

我有一个DataSet,我已添加到我的项目中,我可以使用Visual Studio 2010中的添加查询功能插入和添加记录,但是我想为此添加事务,我找到了一些示例但似乎无法找到一个适合这些的。

我知道我需要以某种方式使用SQLClient.SQLTransaction类。我使用了添加新数据源向导并添加了我需要的表/视图/函数,我只需要一个使用此过程的示例,例如如何获取我的DataSet使用的DataConnection。假设已在向导中设置了所有选项,并且我只使用此向导中要求的预定义适配器和选项,那么如何将事务逻辑添加到我的数据库。

例如,我有一个名为ProductDataSet的DataSet,并为此创建了XSD,然后我将我的Stock表添加为数据源,并添加了一个带向导的AddStock方法,如果新项调用AddItem方法,这也是这些失败我想在这种情况下回滚AddItem和AddStock。

3 个答案:

答案 0 :(得分:3)

在这个例子中,我有一个名为“dsMain”的数据集和一些“QueriesTableAdapter”中的直接查询。我使用一个函数扩展TableAdapter的partial类,该函数将基于第一个(0)连接创建一个事务,然后将其应用于表适配器中的每个连接。

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

通过调用新函数

开始事务
Dim qa As New dsMainTableAdapters.QueriesTableAdapter
Dim oTrans = qa.CreateTransaction()

然后,您可以在事务中调用TableAdapter查询

qa.Query1
qa.Query2

完成查询后,您将提交交易

oTrans.Commit()

您可以为为数据集创建的任何TableAdapter执行相同的操作。 如果您有多个TableAdapter需要使用相同的事务,那么除了“CreateTransaction”之外,您应该创建一个“SetTransaction”并将Transaction作为参数。

答案 1 :(得分:0)

首先感谢你的回答卡特,这对我非常有帮助!

但我无法使用参数

处理零件
  

您可以为为数据集创建的任何TableAdapter执行相同的操作。如果您有多个TableAdapter需要使用相同的事务,那么除了“CreateTransaction”之外,您应该创建一个“SetTransaction”并将Transaction作为参数。

所以我可以使用1个tableadapter处理1个事务,但不能使用2个tableadapter处理1个事务:

我正在为一个学校项目做这个,我真的需要你的帮助! 这里是添加新材料和历史价格的代码(价格变化,如燃料;我将其保存在相关表格中的数据库中):

Namespace DataSetTableAdapters
Partial Public Class MaterialPriceTableAdapter
Public Function SetTransaction() 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

Partial Public Class MaterialTableAdapter

    Public Function CreateTransaction(ByVal MaterialPrice As System.Data.Odbc.OdbcTransaction) 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 Namspace

`

现在代码形式为:

Public Class AddMaterial
Dim material As New DataSetBATableAdapters.MaterialTableAdapter
Dim materialprice As New DataSetBATableAdapters.MaterialPriceTableAdapter
Dim oTrans = material.CreateTransaction(materialprice.SetTransaction())

Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
    Try
        material.InsertQuery(NameTextBox.Text, UnitComboBox.SelectedValue)
        materialprice.InsertQuery(Date_BeginDateTimePicker.Value, PriceTextBox.Text, Date_EndDateTimePicker.Value, Me.LkwTableAdapter.ScalarQuery())
        oTrans.Commit()
    Catch ex As Exception
        oTrans.Rollback()
        MsgBox("Error by Insert")
    End Try
    Me.Close
End Sub
End Class

如果我保存新记录,则不能通过otrans.commit提交materialprice.insertquery。我究竟做错了什么?如果你知道它是什么,请告诉我

感谢, Xeras

答案 2 :(得分:0)

这是未经测试的,但这是我应该编写CreateTransaction / SetTransaction组合的映像(使用您的OdbcTransaction对象)。

Public Function CreateTransaction() As System.Data.Odbc.OdbcTransaction
    Dim oConnection = Me.CommandCollection(0).Connection
    oConnection.Open()

    Dim oTrans = oConnection.BeginTransaction()

    SetTransaction(oTrans)

    Return oTrans
End Function


Public Sub SetTransaction(ByVal oTrans As System.Data.Odbc.OdbcTransaction)
    For Each cmd In Me.CommandCollection
        cmd.Connection = oTrans.Connection
        cmd.Transaction = oTrans
    Next
End Sub