下面實現的方法,可以把你從SQL的Add,Delete,Update,Select的重復勞動解脫出來
1。實體類 2。訪問類
現在以下表為例 tblPerson (perID,perName,perGender,perOld,perNation)
實體類 Person --------- ID Name Gender Old Nation
訪問基類 DataOper ------------ Shared Delete Shared Add Shared Update Shared Select
訪問類 PersonOper:DataOper -------------------- Shared GetAll Shared GetPersonByID Shared GetPersonByName Shared Get......
將數據庫表的信息導入到DB.XML文件中 根據DB.XML文件生成實體類 例如上面的tblPerson表對應的DB.XML中的一個表如下 Name DBName Key Seed Type -------------------------------------- ID perID 1 1 Integer Name perName 0 0 String Gender perGender 0 0 boolean Old perOld 0 0 Integer Nation perNation 0 0 String
將從數據庫返回的DataSet轉換成實體類,如果用一般方式寫的話: ds=cmd.Execute("select * from tblPerson where ID=1") dim p as new Person p.ID=Ctype(ds.Tables(0).Rows(0).Item("perID"),Integer) p.Name=... p.Gender=... p.Old=... p.Nation=... 一張表的轉換還好辦,那么如果又幾十張表效率顯得地下了
這里又另外一種通用的方法,利用.NET提供的反射功能! .NET提供的反射功能可以在知道類方法或屬性的名稱的情況下,動態訪問類的方法。 知道怎么做了嗎? 前面我們有一個從數據庫對應的DB.XML數據庫架構文件 這個文件和實體類的字段一一對應 所以我們只要遍歷這個架構文件,利用反射,就能輕松實現上述的賦值了 讓我們再看看訪問基類 DataOper -------------- Delete(o as Object) Add(o as Object) Update(o as Object)
選擇Add(o as Object)為例說明 public sub Add(o as Object) Dim Type as String=O.GetType.ToString ' 得到傳進來的對象的類型 ... ' 對象類型的字符串和剛才那個XML架構文件中表的名稱一一映射 Dim SchemaTableName as String=GetSchemaTableName(Type) ' 取得需要操作的表的名稱 及從 Person->tblPerson ' 打開數據庫架構文件 Dim dsSchema as new Dataset("DB.XML") Dim SQL as String="Insert into " & SchemaTableName Dim r as DataRow For Each r in dsSchema.Tables(SchemaTableName) ' 在這里操作上面的SQL語句,值的部分利用反射從o中取得,建議寫一個專門身成特定對象特定操作的SQL語句的類 ' 處理一些特殊情況,如主鍵,自動增加值字段等 ' 如果在數據庫架構文件中存儲更多的架構信息,如最大值等,還可以完成一些數據驗證之類的操作 ... Next SQLHelper.Excute(ConnectionString,...Text,SQL) end sub
Delete/Update的通用方法類似
這樣,如果你要添加一個Person的話可以這樣 Dim p as New Person p.Name="HahaSoft" p.Gender=1 p.Old=20 ... PersonOper.Add(p) ' 從DataOper繼承的方法,也可以這樣寫:DataOper.Add(p)
如果要添加一個Book 的話,可以這樣 dim b as New Book b.ISBN= b.Name= ... BookOper.Add(b)
怎么樣,是不是很通用? 這樣寫成一個通用類,可以完成所有的實體類的Add/Update/Delete操作 要注意的是,DB.XML數據庫架構文件很重要
通用實體類操作完成了,下面是通用的 Select 方法 以前在CSDN上看到過這樣的文章: PersonOper.Keys("Name")="HahaSoft" PersonOper.keys("Gender")=1 dim p as new Person=PersonOper.Select() 這樣就能返回相應的Person的實體類 也可以變相完成一些方法:如 getPersonByID(ID) getPersonByName() ......
后來苦想一陣,終于實現了.(待續...)
注:(這里實現的單表的O-R映射,如果對有關聯的表的話,只要聲明一個如 alAddress as ArrayList 的成員就可以了,當然還涉及一些數據
晚期填充以提高效率的技巧,在這里就不詳細介紹了)
|