我设计了一个带有sqlClient.SqlCommand包装器的类来实现诸如超时自动重试,异步(线程安全),错误记录以及WhoAmI等一些sql server功能之类的功能。
我使用了一些强类型数据集,主要仅用于显示目的,但我想拥有与我的类一起使用的相同数据库功能。是否有我可以实现的接口或在设计或运行时将我的命令/连接类挂钩到数据集中的方法?
或者我是否需要以某种方式为数据集编写包装器来实现这些类型的函数?如果这是唯一的选项,它可以通用来包装从数据集继承的任何内容吗?
答案 0 :(得分:0)
这是一种将事务功能扩展到您键入的数据集的方法。您可以将其更改为包含特殊的SQLCommand包装器。
在这个例子中,我有一个名为“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的“BaseClass”,替换“System.ComponentModel.Component”。 通过使用“MustInherit / MustOverride”(C#中的“Abstract”),您可以获得无法达到的属性。
Public MustInherit Class SuperTableAdapter
Inherits System.ComponentModel.Component
Public MustOverride ReadOnly Property MyCommandCollection As Data.SqlClient.SqlCommand()
Public Sub New()
MyBase.New()
'With the command collection exposed, you can replace it with your own.'
For i = 0 To MyCommandCollection.Length - 1
'Now you can put in your special command class here'
Dim myspecialCommand As New Data.SqlClient.SqlCommand()
MyCommandCollection(i) = myspecialCommand
Next
End Sub
End Class
对于您设置为继承BaseClass的每个表适配器,必须覆盖所需的“MustOverride”属性。没有它,它将无法编译。如果添加代码但未设置TableAdapter基类,则它也不会编译。那是好事;它确保你做得对。
Namespace DataSet1TableAdapters
Partial Public Class Table1TableAdapter
Public Overrides ReadOnly Property MyCommandCollection As System.Data.SqlClient.SqlCommand()
Get
Return Me.CommandCollection
End Get
End Property
End Class
Partial Public Class Table2TableAdapter
Public Overrides ReadOnly Property MyCommandCollection As System.Data.SqlClient.SqlCommand()
Get
Return Me.CommandCollection
End Get
End Property
End Class
End Namespace
现在您可以在SuperTableAdapter中添加各种特殊代码。如果您需要访问未公开的内容,只需使用“MustOverride”即可确保其可用。