簡(jiǎn)單搞定數(shù)據(jù)訪問層
發(fā)表時(shí)間:2024-06-16 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]下面實(shí)現(xiàn)的方法,可以把你從SQL的Add,Delete,Update,Select的重復(fù)勞動(dòng)解脫出來1。實(shí)體類2。訪問類現(xiàn)在以下表為例tblPerson(perID,perName,perGender,perOld,perNation)實(shí)體類Person---------IDNameGenderO...
下面實(shí)現(xiàn)的方法,可以把你從SQL的Add,Delete,Update,Select的重復(fù)勞動(dòng)解脫出來
1。實(shí)體類
2。訪問類
現(xiàn)在以下表為例
tblPerson
(perID,perName,perGender,perOld,perNation)
實(shí)體類
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......
將數(shù)據(jù)庫(kù)表的信息導(dǎo)入到DB.XML文件中
根據(jù)DB.XML文件生成實(shí)體類
例如上面的tblPerson表對(duì)應(yīng)的DB.XML中的一個(gè)表如下
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
將從數(shù)據(jù)庫(kù)返回的DataSet轉(zhuǎn)換成實(shí)體類,如果用一般方式寫的話:
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=...
一張表的轉(zhuǎn)換還好辦,那么如果又幾十張表效率顯得地下了
這里又另外一種通用的方法,利用.NET提供的反射功能!
.NET提供的反射功能可以在知道類方法或?qū)傩缘拿Q的情況下,動(dòng)態(tài)訪問類的方法。
知道怎么做了嗎?
前面我們有一個(gè)從數(shù)據(jù)庫(kù)對(duì)應(yīng)的DB.XML數(shù)據(jù)庫(kù)架構(gòu)文件
這個(gè)文件和實(shí)體類的字段一一對(duì)應(yīng)
所以我們只要遍歷這個(gè)架構(gòu)文件,利用反射,就能輕松實(shí)現(xiàn)上述的賦值了
讓我們?cè)倏纯丛L問基類
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 ' 得到傳進(jìn)來的對(duì)象的類型
... ' 對(duì)象類型的字符串和剛才那個(gè)XML架構(gòu)文件中表的名稱一一映射
Dim SchemaTableName as String=GetSchemaTableName(Type) ' 取得需要操作的表的名稱 及從 Person->tblPerson
' 打開數(shù)據(jù)庫(kù)架構(gòu)文件
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語(yǔ)句,值的部分利用反射從o中取得,建議寫一個(gè)專門身成特定對(duì)象特定操作的SQL語(yǔ)句的類
' 處理一些特殊情況,如主鍵,自動(dòng)增加值字段等
' 如果在數(shù)據(jù)庫(kù)架構(gòu)文件中存儲(chǔ)更多的架構(gòu)信息,如最大值等,還可以完成一些數(shù)據(jù)驗(yàn)證之類的操作
...
Next
SQLHelper.Excute(ConnectionString,...Text,SQL)
end sub
Delete/Update的通用方法類似
這樣,如果你要添加一個(gè)Person的話可以這樣
Dim p as New Person
p.Name="HahaSoft"
p.Gender=1
p.Old=20
...
PersonOper.Add(p) ' 從DataOper繼承的方法,也可以這樣寫:DataOper.Add(p)
如果要添加一個(gè)Book 的話,可以這樣
dim b as New Book
b.ISBN=
b.Name=
...
BookOper.Add(b)
怎么樣,是不是很通用?
這樣寫成一個(gè)通用類,可以完成所有的實(shí)體類的Add/Update/Delete操作
要注意的是,DB.XML數(shù)據(jù)庫(kù)架構(gòu)文件很重要
通用實(shí)體類操作完成了,下面是通用的 Select 方法
以前在CSDN上看到過這樣的文章:
PersonOper.Keys("Name")="HahaSoft"
PersonOper.keys("Gender")=1
dim p as new Person=PersonOper.Select()
這樣就能返回相應(yīng)的Person的實(shí)體類
也可以變相完成一些方法:如
getPersonByID(ID)
getPersonByName()
......
后來苦想一陣,終于實(shí)現(xiàn)了.(待續(xù)...)
注:(這里實(shí)現(xiàn)的單表的O-R映射,如果對(duì)有關(guān)聯(lián)的表的話,只要聲明一個(gè)如 alAddress as ArrayList 的成員就可以了,當(dāng)然還涉及一些數(shù)據(jù)
晚期填充以提高效率的技巧,在這里就不詳細(xì)介紹了)