【问题标题】:How to add Transactions with a DataSet created using the Add Connection Wizard?如何使用添加连接向导创建的数据集添加事务?
【发布时间】:2010-04-16 10:18:51
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能还想查看System.Transactions.TransactionScope 类。
  • 谢谢也看过了,但不确定它是否用于此目的,但可能错过了它,所以谢谢你提到它。
  • 如果有使用向导创建数据源和数据集时添加事务的示例,请在此处链接或提及。

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


【解决方案1】:

在这个例子中,我有一个名为“dsMain”的数据集和一个“QueriesTableAdapter”中的一些直接查询。我使用一个函数扩展了 TableAdapter 的部分类,该函数将基于第一个 (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 作为参数。

【讨论】:

  • 谢谢 看起来很有趣,暂时无法尝试,但这看起来像我需要的 - 如果我让它工作,将标记为答案。
【解决方案2】:

首先感谢卡特的回答,对我帮助很大!

但我无法处理带有参数的部分

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

所以我能够用 1 个表适配器处理 1 个事务,但不能用 2 个表适配器处理 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

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

谢谢, 泽拉斯

【讨论】:

  • 对于这个需要传递事务对象的问题,我的解决方案是使用带有插入语句的单个表适配器,因为我无法让事务对象正确持久,希望有一个让单个事务对象在 TableAdapter 之间持久存在的方法,但我尝试了一些方法,它们对我不起作用,但它们可能对你有用。
  • 哈哈这对我有用 :)),我正在从同一个 tableadapter 编写两个插入语句,从来没有想过,非常感谢 looooot!!!
  • 很高兴它有帮助!起初我也没有考虑过这一点,只是因为我可以让它与一个适配器而不是两个适配器一起工作,我才想到将所有插入件放在第一个适配器中,即使它们用于不同的适配器,这也有效表。
【解决方案3】:

这是未经测试的,但这就是我应该如何编写 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

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2019-07-11
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2011-03-08
    • 2021-01-14
    相关资源
    最近更新 更多