天天看點

輕松搞定資料通路層1

 輕松搞定資料通路層     yuhonglai [原作]

下面實作的方法,可以把你從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 的成員就可以了,當然還涉及一些資料

晚期填充以提高效率的技巧,在這裡就不詳細介紹了)