2010-07-07 86 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表示形式存儲在數據庫的文本字段中。如果您知道該類型,則可以將任何類型的對象存儲在單個表中。但是你失去了查詢你的對象的能力。