2009-06-20 5 views
1

J'ai conçu une classe avec les wrappers sqlClient.SqlCommand pour implémenter des fonctionnalités telles que les tentatives automatiques sur le timeout, la sécurité asynchrone (thread thread), la journalisation des erreurs et certaines fonctions du serveur sql comme WhoAmI.Comment puis-je utiliser ma propre classe de connexion avec un jeu de données fortement typé?

J'ai utilisé des ensembles de données fortement typés principalement à des fins d'affichage seulement, mais j'aimerais avoir la même fonctionnalité de base de données que celle que j'utilise avec ma classe. Existe-t-il une interface que je peux implémenter ou un moyen de connecter ma classe de commande/connexion dans l'ensemble de données lors de la conception ou de l'exécution?

Ou aurais-je besoin d'écrire en quelque sorte un wrapper pour que l'ensemble de données implémente ces types de fonctions? Si c'est la seule option, pourrait-elle être générique pour envelopper tout ce qui hérite de l'ensemble de données?

Répondre

0

Voici une réponse plus spécifique. Cela demontrastes comment vous pouvez utiliser un baseclass pour vos jeux de données typés dans le but de permuter dans votre propre connexion ou classes de commande.

Définissez ceci comme "BaseClass" pour chacun de vos TableAdapters typés, en remplaçant "System.ComponentModel.Component". En utilisant "MustInherit/MustOverride" ("Abstract" en C#), vous pouvez accéder aux propriétés que vous ne pouvez pas atteindre autrement.

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 

Pour chacun de vos adaptateurs de table que vous définissez pour hériter votre BaseClass vous devez remplacer la propriété requise « MustOverride ». Sans cela, il ne compilera pas. Si vous ajoutez le code mais ne définissez pas la classe de base TableAdapter, il ne compilera pas non plus. C'est une bonne chose; Cela vous assure de bien faire les choses.

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 

Maintenant, vous pouvez mettre toutes sortes de code spécial dans votre SuperTableAdapter. Si vous avez besoin d'accéder à quelque chose qui n'a pas été exposé, utilisez simplement "MustOverride" pour garantir qu'il est disponible.

0

Voici un moyen d'étendre la fonctionnalité transactionnelle à votre jeu de données typé. Vous pouvez modifier ceci pour inclure vos wrappers SQLCommand spéciaux.

Dans cet exemple, j'ai un jeu de données appelé "dsMain" et quelques requêtes directes dans un "QueriesTableAdapter". J'étend la classe partielle pour le TableAdapter avec une fonction qui créera une transaction basée sur la première (0) connexion, puis l'appliquera à chaque connexion dans l'adaptateur de table.

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 

Vous commencez la transaction en appelant la nouvelle fonction

Dim qa As New dsMainTableAdapters.QueriesTableAdapter 
Dim oTrans = qa.CreateTransaction() 

Ensuite, vous pouvez appeler les requêtes TableAdapter au sein de votre transaction

qa.Query1 
qa.Query2 

Lorsque vous avez terminé avec vos questions que vous commettez la transaction

oTrans.Commit() 

Vous pouvez faire la même chose pour n'importe quel TableAdapter créé pour vos jeux de données. Si vous avez plusieurs TableAdapters qui ont besoin d'utiliser la même transaction, en plus d'un "CreateTransaction" vous devez faire un "SetTransaction" et faire de la transaction un paramètre.

+0

Comment cela répond-t-il à la question d'une connexion client SQL personnalisée pour les tentatives? (timeouts) votre réponse a à voir avec les transactions ne pas réessayer, exécution asynchrone? – Maslow

+0

La solution montre comment accéder aux propriétés de connexion/commande des jeux de données typés. Selon la façon dont vous avez implémenté votre classe, vous devrez remplacer les connexions/commandes dans un code similaire à celui-ci afin qu'il utilise votre classe. –

Questions connexes