Как я могу использовать свой собственный класс соединения со строго типизированным набором данных? - PullRequest
1 голос
/ 20 июня 2009

Я разработал класс с оболочками sqlClient.SqlCommand для реализации таких функций, как автоматические повторные попытки по тайм-ауту, Async (безопасность потоков), ведение журнала ошибок и некоторые функции сервера sql, такие как WhoAmI.

Я использовал некоторые строго типизированные наборы данных в основном только для отображения, но я хотел бы иметь те же функциональные возможности базы данных, которые я использую с моим классом. Есть ли интерфейс, который я могу реализовать, или способ подключить мой класс команды / соединения к набору данных во время проектирования или выполнения?

Или мне нужно было бы как-то написать оболочку для набора данных для реализации этих типов функций? если это единственная опция, можно ли сделать ее универсальной, чтобы обернуть все, что унаследовано от набора данных?

Ответы [ 2 ]

0 голосов
/ 15 мая 2010

Вот более конкретный ответ. Это демонстрирует, как вы можете использовать базовый класс для своих набранных наборов данных с целью замены в вашем собственном соединении или классах команд.

Установите это как «BaseClass» для каждого из ваших типизированных адаптеров таблиц, заменив «System.ComponentModel.Component». Используя «MustInherit / MustOverride» («Абстрактный» в C #), вы можете получить свойства, которые иначе не будут доступны.

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

Для каждого из ваших адаптеров таблиц, которые вы установили для наследования базового класса, вы должны переопределить обязательное свойство "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», чтобы гарантировать его доступность.

0 голосов
/ 08 мая 2010

Вот способ расширить функциональность транзакций для вашего типизированного набора данных. Вы можете изменить это, чтобы включить ваши специальные оболочки SQLCommand.

В этом примере у меня есть набор данных с именем "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, который был создан для ваших наборов данных. Если у вас есть несколько адаптеров таблиц, которые должны использовать одну и ту же транзакцию, то в дополнение к «CreateTransaction» вы должны сделать «SetTransaction» и указать, что Transaction является параметром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...