2010-07-07 6 views
0

Je suis actuellement jouer avec VB.Net en utilisant Visual Studio 2010 (.Net 4.0) et j'ai besoin de votre aide pour créer une classe de collection (appelons-le « cl_MyCollection ») avec un constructeur qui accepte deux arguments:choisir Programmatically la classe pour être instancier

  1. un objet SqlDataReader
  2. Certains moyens de pointer vers une classe personnalisée, j'ai créé

Le scénario est; J'ai cinq tables de base de données dans SQL 2000 et cinq classes personnalisées VB.Net. Chaque classe personnalisée contient une variable pour chaque champ de la table représentée par la classe. Par exemple: « tbl_User » a 2 champs « user_id » et « nom_utilisateur » et tbl_Family » a 3 champs « Family_ID », « FAMILY_NAME » et « Family_Location »
Voici la classe personnalisée VB.Net j'ai créé l'intention. lire et stocker un seul enregistrement de la « tbl_User » tableau.

Imports System.Data.SqlClient 

Public Class cl_table_User 
    Property User_ID As Integer 
    Property User_Name As String 

    Public Sub New(ByRef rdr As SqlDataReader) 
     Me.User_ID = rdr("User_ID) 
     Me.User_Name = rdr("User_Name") 
    End Sub 
End Class 

J'ai créé

classes similaires pour les autres tables de base de données l'idée est d'effectuer une instruction SQL et utiliser les résultats pour instancier mon Je pensais à quelque chose comme ça: ('conn' est un objet 'SqlConnection')

 
Dim cmd As SqlCommand = New SqlCommand("Select * From tbl_Users", conn) 
Dim rdr As SqlDataReader = cmd.ExecuteReader() 
Dim aCollection as new cl_MyCollection(rdr, "tbl_Users") 

et plus tard, quand je veux utiliser « tbl_Family »:

 
Dim cmd As SqlCommand = New SqlCommand("Select * From tbl_Family", conn) 
Dim rdr As SqlDataReader = cmd.ExecuteReader() 
Dim aCollection as new cl_MyCollection(rdr, "tbl_Family") 

Comme vous pouvez le voir la troisième ligne passe deux arguments, la SQLDataReader et des moyens de pointer vers une classe personnalisée je créé. Le constructeur de cette classe va ensuite parcourir les résultats et créer un objet de la classe personnalisée que j'ai créée.

Je veux que le second argument (en quelque sorte), il est de décider quelle classe personnalisée à utiliser. Le 'en quelque sorte' est pourquoi je suis ici pour demander votre aide. La seule façon que je peux penser que cela fonctionnera est de mettre en place un cas de sélection et de lister chaque classe personnalisée, puis de créer un objet de la classe personnalisée, mais j'espère qu'il y aura un meilleur moyen. À l'heure actuelle, je l'ai mis en place comme ceci:

 
Public Class cl_MyCollection 
    Private records As New Collection 

    Public Sub New(rdr As SqlDataReader, selectedClass as string) 

     Select Case selectedClass 
      Case "tbl_User" 

       While (rdr.Read()) 
        Dim thisRecord as new cl_table_User(rdr) 
        records.Add(thisRecord) 
       End While 

      Case "tbl_Family" 

       While (rdr.Read()) 
        dim thisRecord as new cl_table_Family(rdr) 
        records.Add(thisRecord) 
       End While    

     End Select 

    End Sub 
End Class 

Idéalement je voudrais le code suivant au travail, ou au moins l'idée qu'il représente:

 
Public Class cl_MyCollection 
    Private records As New Collection 

    Public Sub New(rdr As SqlDataReader, selectedClass as TYPE) 

     While (rdr.Read()) 
      Dim thisRecord as new selectedClass(rdr) 
      records.Add(thisRecord) 
     End While 

    End Sub 
End Class 

Est-ce possible? ou dois-je rester avec le cas choisi?

P.S Désolé pour la longueur de ce message. Modifier: Correction d'une faute de frappe, le cas de sélection pointe maintenant vers le second argument ('selectedClass') comme prévu à l'origine.

+1

Avez-vous regardé les ORM? –

+0

Merci pour les réponses, j'ai jeté un oeil à quelques techniques ORM et à la librairie Collections.Generic mais j'ai du mal à comprendre comment implémenter l'une ou l'autre pour s'adapter à mon code existant. Puis-je vous demander comment vous attendez que mon code apparaisse avec les nouvelles idées? De là, je devrais être capable de l'adapter à la suite de mon projet. Merci encore pour toute aide. – user328414

Répondre

1

Si vous voulez simplifier les choses et rester loin de XML et ORM, vous pouvez utiliser des génériques.

http://msdn.microsoft.com/en-us/library/512aeb7t.aspx

lien ci-dessus indique au sujet des génériques, mais seulement des exemples en C#.

Pour utiliser un générique VB.NET utilise (de type1, type2) au lieu de < type1, type2 >

Sinon, suivez la suggestion de Mitch blé. ORM est très simple une fois que vous savez comment l'utiliser.

0

Utiliser un Object-Relational Mapper (ORM), tels que NHibernate.

cartographes objet-relationnel font exactement comme vous le décrivez; ils mappent les tables de base de données aux classes de code, et vice versa. L'ORM vous permettra de choisir la classe à instancier.

Si vous avez juste besoin d'un moyen de lyophiliser des objets et de les décongeler, vous pouvez stocker une représentation XML de votre objet dans un champ de texte de la base de données par serializing. Si vous connaissez le type, cela vous permet de stocker n'importe quel type d'objet dans une seule table. Mais vous perdez la possibilité d'interroger vos objets.

Questions connexes