2010-07-07 3 views
0

В настоящее время я играю с VB.Net с помощью Visual Studio 2010. (.Net 4.0), и мне нужна ваша помощь для создания класса коллекции (назовем его cl_MyCollection) с конструктором, который принимает два аргумента:Программный выбор класса для создания экземпляра

  1. SqlDataReader объект
  2. Некоторые средства, указывающие на пользовательский класс я создал

сценарий; У меня есть пять таблиц базы данных в SQL 2000 и пять пользовательских классов VB.Net. Каждый пользовательский класс содержит переменную для каждого поля таблицы, которую представляет класс. Например: «tbl_User» имеет 2 поля «User_ID» и «User_Name», а tbl_Family «имеет 3 поля« Family_ID »,« Family_Name »и« Family_Location ».
Вот пользовательский класс VB.Net, который я создал, предназначен для читать и хранить одну запись таблицы «tbl_User»:.

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 

я создал аналогичные классы для других таблиц базы данных

идеи выполнить оператор SQL и использовать полученные результаты для создания экземпляра моих ('cl_MyCollection') Я думал что-то вроде этого: ('conn' - объект '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") 

и позже, когда я хочу использовать «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") 

Как вы можете видеть, что третья линия проходит два аргумента SQLDataReader и некоторые средства, указывающие на пользовательский класс у меня есть создано. Конструктор этого класса затем перебирает результаты и создает объект созданного мной класса.

Я хочу, чтобы второй аргумент (каким-то образом) заставил его решить, какой пользовательский класс использовать. «Почему-то» - вот почему я здесь прошу вас о помощи.

Единственный способ, с помощью которого я могу думать, что это сработает, - это создать случай выбора и перечислить каждый пользовательский класс, а затем создать объект пользовательского класса, но я надеюсь, что есть лучший способ. В настоящее время она у меня настроить так:

 
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 

В идеале я хотел бы следующий код, чтобы работать, или, по крайней мере, идея представляет:

 
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 

Возможно ли это? или мне нужно придерживаться варианта выбора?

P.S Извините за длину этого сообщения. Изменить: Исправлена ​​опечатка, теперь случай выбора указывает на второй аргумент ('selectedClass'), как первоначально предполагалось.

+1

Вы смотрите на ORM? –

+0

Спасибо за ответы, я взглянул на несколько методов ORM и библиотеку Collections.Generic, но у меня возникли проблемы с пониманием того, как реализовать любой из них в соответствии с моим существующим кодом. Могу ли я спросить, как вы, ребята, ожидаете, что мой код будет выглядеть с новыми идеями? Оттуда я должен был бы приспособить его к набору остальной части моего проекта. Еще раз спасибо за любую помощь. – user328414

ответ

1

Если вы хотите сделать вещи «более простыми» и держаться подальше от XML и ORM, вы можете использовать дженерики.

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

Выше ссылка говорит о дженериков, а только примеры в C#.

Чтобы использовать родовое в VB.NET использует (Of type1, type2) вместо < type1, type2 >

В противном случае последовать совету Митч пшеницы в. ORM очень просто, как только вы знаете, как его использовать.

0

Используйте Object-Relational Mapper (ORM), например, NHibernate.

Объектно-реляционные картографы выполняют то, что вы описываете; они сопоставляют таблицы базы данных с классами классов и наоборот. ORM позволит вам выбрать класс для создания экземпляра.

Если вам просто нужен способ замораживания сухих объектов и оттаивания их, вы можете сохранить XML-представление своего объекта в текстовом поле базы данных на serializing. Если вы знаете тип, это позволяет хранить любые объекты в одной таблице. Но вы теряете возможность запрашивать свои объекты.

Смежные вопросы