2009-06-20 2 views
1

시간 제한, 비동기 (스레드 안전성), 오류 로깅 및 WhoAmI와 같은 일부 SQL Server 기능에서 자동 재시도와 같은 기능을 구현하기 위해 sqlClient.SqlCommand 래퍼로 클래스를 설계했습니다.강하게 입력 된 데이터 세트에서 내 연결 클래스를 사용하려면 어떻게해야합니까?

저는 주로 표시 전용으로 강력한 형식의 데이터 집합을 사용했지만 클래스와 함께 사용하는 것과 동일한 데이터베이스 기능을 사용하고 싶습니다. 구현할 수있는 인터페이스가 있습니까? 또는 명령/연결 클래스를 디자인 또는 런타임에 데이터 세트에 연결하는 방법이 있습니까?

아니면 이러한 유형의 함수를 구현하기 위해 데이터 세트의 래퍼를 작성해야합니까? 이것이 유일한 옵션 인 경우 데이터 집합에서 상속되는 모든 것을 래핑하기 위해 일반화 할 수 있습니까?

답변

0

다음은 좀 더 구체적인 답변입니다. 이것은 자신 만의 연결이나 명령 클래스를 교환하기 위해 입력 된 데이터 세트에 대한 기본 클래스를 사용하는 방법을 설명하지 않습니다.

"System.ComponentModel.Component"를 대체하는 입력 된 TableAdapter 각각에 대해 "BaseClass"로 설정합니다. "MustInherit/MustOverride"(C#의 "Abstract")를 사용하면 다르게 도달 할 수없는 속성으로 이동할 수 있습니다. 당신이 필요합니다 "MustOverride"속성을 재정의해야합니다 BaseClass로를 상속하도록 설정 테이블 어댑터 각각에 대해

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 

. 그것 없이는 컴파일되지 않습니다. 코드를 추가하지만 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 랩퍼를 포함하도록이를 변경할 수 있습니다.

이 예제에서는 "dsMain"이라는 데이터 집합과 "QueriesTableAdapter"의 몇 가지 직접 쿼리가 있습니다. 첫 번째 (0) 연결을 기반으로 트랜잭션을 만들고 테이블 어댑터의 모든 연결에 적용하는 함수를 사용하여 TableAdapter의 부분 클래스를 확장합니다.

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"을 만들어 트랜잭션을 매개 변수로 사용해야합니다.

+0

이 방법은 재시도를 위해 사용자 지정 SQL 클라이언트 연결에 대한 질문에 어떻게 대답합니까? 응답이 재 시도가 아닌 비동기 실행과 관련된 작업 (시간 초과)이 있습니까? – Maslow

+0

이 솔루션은 입력 된 데이터 집합의 연결/명령 속성에 액세스하는 방법을 보여줍니다. 클래스를 구현 한 방법에 따라 코드와 같이 클래스를 사용하도록 연결/명령을 바꿔야합니다. –