2010-07-07 77 views
0

我目前正在使用Visual Studio 2010(.Net 4.0)使用VB.Net,我需要您的帮助来创建一个集合类(我们称之为'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和指向自定义类我有一些手段创建。此类的构造函数将遍历结果并创建我创建的自定义类的对象。

我想第二个参数(以某种方式)使它决定使用哪个自定义类。 '不知何故'就是为什么我在这里寻求你的帮助。

我能想到的唯一方法是设置一个select case并列出每个自定义类,然后创建一个自定义类的对象,但我希望有更好的方法。目前,我有它成立这样的:

 
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吗? – 2010-07-07 14:38:33

+0

Thankyou的回复,我看了几个ORM技术和Collections.Generic库,但我无法理解如何实现其中任何一个以适应我现有的代码。我能问一下你们如何期望我的代码能够看到新的想法?从那里我应该能够适应我的项目的其余部分。谢谢你的帮助。 – user328414 2010-07-07 16:15:54

回答

1

如果您想让事情“更简单”并远离XML和ORM,则可以使用泛型。

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

上面的链接讲述仿制药,但只有在C#示例。

用一个通用的VB.NET它使用(TYPE1中,2型),而不是< TYPE1,TYPE2 >

否则跟随米奇小麦的建议。一旦你知道如何使用它,ORM非常简单。

0

使用Object-Relational Mapper(ORM),例如NHibernate。

对象关系映射程序完全按照您的描述进行;他们将数据库表映射到代码类,反之亦然。 ORM将允许您选择要实例化的类。

如果您只需要冻结对象并解冻它们的方法,则可以通过serializing它将对象的XML表示形式存储在数据库的文本字段中。如果您知道该类型,则可以将任何类型的对象存储在单个表中。但是你失去了查询你的对象的能力。