我目前正在使用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 回答
如果你想让事情“更简单”并远离XML和ORM,你可以使用泛型 .
http://msdn.microsoft.com/en-us/library/512aeb7t.aspx
上面的链接讲述了泛型,但只是C#中的例子 .
要在VB.NET中使用泛型,它使用(Of type1,type2)而不是<type1,type2>
否则请遵循Mitch Wheat的建议 . 一旦你知道如何使用它,ORM就非常简单 .
使用Object-Relational Mapper(ORM),例如NHibernate .
对象关系映射器完全按照您的描述执行;他们将数据库表映射到代码类,反之亦然 . ORM将允许您选择要实例化的类 .
如果您只需要冻结对象并解冻它们的方法,则可以通过serializing将对象的XML表示形式存储在数据库的文本字段中 . 如果您知道类型,则允许您将任何类型的对象存储在单个表中 . 但是你失去了查询对象的能力 .