我有一个DataSet,我已添加到我的项目中,我可以使用Visual Studio 2010中的添加查询功能插入和添加记录,但是我想为此添加事务,我找到了一些示例但似乎无法找到一个适合这些的。
我知道我需要以某种方式使用SQLClient.SQLTransaction类。我使用了添加新数据源向导并添加了我需要的表/视图/函数,我只需要一个使用此过程的示例,例如如何获取我的DataSet使用的DataConnection。假设已在向导中设置了所有选项,并且我只使用此向导中要求的预定义适配器和选项,那么如何将事务逻辑添加到我的数据库。
例如,我有一个名为ProductDataSet的DataSet,并为此创建了XSD,然后我将我的Stock表添加为数据源,并添加了一个带向导的AddStock方法,如果新项调用AddItem方法,这也是这些失败我想在这种情况下回滚AddItem和AddStock。
答案 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