2009-06-20 43 views
1

我設計了一個包含sqlClient.SqlCommand包裝器的類,用於實現超時,異步(線程安全),錯誤日誌記錄以及像WhoAmI這樣的一些sql服務器功能的自動重試。如何使用我自己的強類型數據集的連接類?

我已經使用了一些強類型的數據集,主要用於顯示目的,但我想要有與我的課程相同的數據庫功能。有沒有我可以實現的接口,或者在設計或運行時將我的命令/連接類掛接到數據集的方法?

或者我是否需要以某種方式爲數據集編寫包裝來實現這些類型的函數?如果這是唯一的選擇,它可以通用來包裝從數據集繼承的任何東西?

回答

0

下面是一個更具體的答案。這demontrastes如何使用類型化數據集的基類來交換您自己的連接或命令類。

將此設置爲每個您鍵入的TableAdapter的「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 

對於您設置爲繼承您的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」來確保它可用。

0

以下是將事務功能擴展到類型化數據集的一種方法。您可以改變它以包含特殊的SQLCommand包裝器。

在本例中,我在「QueriesTableAdapter」中有一個名爲「dsMain」的數據集和一些直接查詢。我使用一個函數來擴展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() 

然後,你可以打電話給你的交易

qa.Query1 
qa.Query2 

內的TableAdapter查詢,當你與你的查詢做了你提交事務開始交易

oTrans.Commit() 

對於爲數據集創建的任何TableAdapter,您可以做同樣的事情。 如果您有多個需要使用相同事務的TableAdapter,那麼除了「CreateTransaction」之外,您應該創建一個「SetTransaction」並將Transaction作爲參數。

+0

這是如何回答自定義sql客戶端連接重試的問題? (超時)你的答案必須處理與事務不重試,異步執行? – Maslow 2010-05-09 02:35:44

相關問題