首页 文章

以编程方式选择要实例化的类

提问于
浏览
0

我目前正在使用Visual Studio 2010(.Net 4.0)使用VB.Net,我需要你的帮助来创建一个集合类(让我们称之为'cl_MyCollection'),其构造函数接受两个参数:

  • 一个 SqlDataReader 对象

  • 指向我创建的自定义类的一些方法

情景是;我在SQL 2000中有五个数据库表和五个VB.Net自定义类 . 每个自定义类都包含该类表示的表的每个字段的变量 . 例如:"tbl_User"有2个字段"User_ID"和"User_Name"和tbl_Family " has 3 fields " Family_ID ", " Family_Name " and " 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')按原设想 .

2 回答

  • 0

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

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

    上面的链接讲述了泛型,但只是C#中的例子 .

    要在VB.NET中使用泛型,它使用(Of type1,type2)而不是<type1,type2>

    否则请遵循Mitch Wheat的建议 . 一旦你知道如何使用它,ORM就非常简单 .

  • 1

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

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

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

相关问题