如何将自己的连接类与强类型数据集一起使用?

时间:2009-06-20 16:14:36

标签: .net visual-studio dataset strongly-typed-dataset

我设计了一个带有sqlClient.SqlCommand包装器的类来实现诸如超时自动重试,异步(线程安全),错误记录以及WhoAmI等一些sql server功能之类的功能。

我使用了一些强类型数据集,主要仅用于显示目的,但我想拥有与我的类一起使用的相同数据库功能。是否有我可以实现的接口或在设计或运行时将我的命令/连接类挂钩到数据集中的方法?

或者我是否需要以某种方式为数据集编写包装器来实现这些类型的函数?如果这是唯一的选项,它可以通用来包装从数据集继承的任何内容吗?

2 个答案:

答案 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”即可确保其可用。