Asp.net 如何使用使用“添加连接向导”创建的数据集添加事务?

Asp.net 如何使用使用“添加连接向导”创建的数据集添加事务?,asp.net,sql,sql-server,visual-studio-2010,transactions,Asp.net,Sql,Sql Server,Visual Studio 2010,Transactions,我有一个数据集,我已经添加到我的项目中,在那里我可以使用Visual Studio 2010中的添加查询功能插入和添加记录,但是我想向其中添加事务,我已经找到了一些示例,但似乎找不到一个与这些示例一起使用的示例 我知道我需要以某种方式使用SQLClient.SQLTransaction类。我使用了添加新数据源向导并添加了所需的表/视图/函数,我只需要一个使用此过程的示例,例如如何获取数据集使用的数据连接。假设已在向导中设置了所有选项,并且我只使用此向导中要求的预定义适配器和选项,那么如何将事务逻

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

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


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

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

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()
完成查询后,提交事务

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

首先感谢您的回答,carter,这对我帮助很大

但是我不能用参数来处理零件

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

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

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

`

现在是表单中的代码表单:

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提交。我做错了什么?如果你知道它是什么,请告诉我

谢谢,
Xeras

这是未经测试的,但这就是我应该如何编写CreateTransaction/SetTransaction组合(使用OdbcTransaction对象)


您可能还想查看
System.Transactions.TransactionScope
类。感谢您也查看了该类,但不确定它是否用于此目的,可能没有看到,但感谢您提及它。如果使用向导创建数据源和数据集时有添加事务的示例,然后请链接到他们或在这里提到他们。谢谢看起来很有趣,现在不能尝试,但这看起来像是我需要的-如果我让它工作,它将标记为答案。我的解决方案是使用一个带有inserts语句的表适配器来传递事务对象,因为我无法使事务对象正确持久化,希望有一种方法可以在tableadapter之间持久化一个事务对象,但我尝试了一些方法,它们对我不起作用,但对你可能起作用。哈哈,这对我有效:)),我正在从同一个tableadapter编写两个insert语句,从来没有想过,非常感谢Loooot!!!很高兴它有帮助!我一开始也没有考虑过这一点,只是因为我可以让它使用一个适配器,而不是两个适配器,我才想到将所有插入放在第一个适配器中,即使它们用于不同的表,这也是有效的。