輕松搞定數據訪問層[續]
2024-07-21 02:23:21
供稿:網友
數據庫表
tbl_teacher
數據字段名稱
類型
說明
teaid
int
自動編號
teacode
char(20)
教師員工號
teaname
nchar(10)
?
teagender
bit
?
teanation
nchar(6)
?
teaage
tinyint
?
tbl_student
數據字段名稱
類型
說明
stuid
int
自動編號
stucode
char(20)
學生證號
stuteachercode
char(20)
班主任的員工號
stuname
nchar(10)
姓名
stugender
bit
性別
stunation
nchar(6)
民族
stuage
tinyint
年齡
stuclassid
int
班級的id
用以描述這兩張表的xml文件,該xml文件存放的是這兩種表的結構信息
假設該文件的名稱位? db.xml
tbl_teacher
name
dbname
type
seed
key
id
teaid
integer
1
1
code
teacode
string
0
0
name
teaname
string
0
0
gender
teagender
boolean
0
0
nation
teanation
string
0
0
age
teaage
integer
0
0
tbl_student
name
dbname
type
seed
key
id
stuid
integer
1
1
code
stucode
string
0
0
teachercode
stuteachercode
string
0
0
name
stuname
string
0
0
gender
stugender
boolean
0
0
nation
stunation
string
0
0
age
stuage
integer
0
0
classid
stuclassid
integer
0
0
必須的類
clssqlhelper:微軟的數據訪問輔助類
clssqlbuilder:根據配置文件生成相應sql語句的類 見輕松搞定數據訪問層[續1]
clsdataaccessoper:所以操作類的父類,提供通用的數據操作方法 見輕松搞定數據訪問層[續2]
clsdataaccess:暫時沒有什么用
數據類和訪問類
實體類clsteacher 的屬性(property),與數據庫字段一一對應
property id as integer
property code as string
property name as string
property gender as boolean
property nation as string
property age as integer
實體類clsstudent
property id as integer
property code as string
property teachercode as string
property name as string
property gender as boolean
property nation as string
property age as integer
property classid as integer
注意:上面兩個類的具體代碼就不用寫了吧
訪問類clsteacheroper 從 clsdataaccessoper 繼承
public class clsteacheroper
public function getall() as arraylist
return clsdataaccessoper.select((new clsteacher).gettype)
end function
public function getteacherbycode(code as string) as clsteacher
sdataaccessoper.selectkeys("code") = code
return clsdataaccessoper.select((new clsteacher).gettype).item(0)
end function
'以下方法類似,實現的是一些如 getxxx by yyy 的查詢
'據操作如添加/刪除/修改全部從 clsdataaccessoper 中繼承
'這里的查詢方法都可以用 clsdataaccessoper.selectkeys(“”)=… 實現
'只是為了提供更友好的接口,如果你時間緊迫可以把
' clsdataaccessoper.selectkeys/select 方法提交給邏輯層或表示層的程序員
end class
訪問類 clsstudentoper從 clsdataaccessoper 繼承
(同 clsteacheroper 類)
上篇<<輕松搞定數據訪問層>>文章有人說我代碼太少,看不懂。其實我只想說明一下道理。
現在,我貼出 clssqlbuilder clsdataaccessoper 這兩個核心類的全部代碼。這也只是想更明白的說清楚道理。這兩個類還是第一版本,代碼質量不是很高,一些異常沒有拋出.只是實現了一些功能。
順便提到的是,實體類可以通過數據庫腳本生成,這個工具當然是要自己寫的了。工具很簡單,兩三百行就可以搞定。還有那個數據庫結構信息的xml文件自己寫也很麻煩,所以也可以寫一個自動生成它的工具。
這都不是這個文章討論的重點,這里就不介紹怎樣才能生成那些模樣幾乎相同的代碼了。
這種數據訪問方法的優點在于:
如果你的數據庫有變動,比如說tbl_teahcer 表加了一個字段職稱(teatitle),那么你只需要在 clsteacher 表里加一個屬性 property title,然后在 db.xml 文件中的 tblteacher 里加一條記錄 title|teatitle|string|0|0就可以了。
編碼速度快,除了這兩個核心類,數據實體類可以自動生成,訪問類也只是簡單的寫一些查詢方法.
不用寫sql語句。
使用方法舉例:
添加一個教師
dim newteacher as new clsteacher
with newteahcer
‘ 此處如果有id的賦值,將被忽略,因為是自動增加值。見 clssqlbuilder
.name=”haha”
.code=”2001”
.gender=true
…
end with
clsteacheroper.add(newteacher)
添加一個學生
dim newstudent as new clsstudent
with newstudent
.name=”tom”
.gender=true
.teachercode=”2001”
…
end with
clsstudentoper.add(newstudent)
更新刪除類似(這里就不舉例了)。
現在再就添加一個教師的程序流程大概介紹一下。
當執行 clsteacheroper.add(newteancher) 后,clsdataaccessoper.add 會把 newteacher繼續傳遞給 clssqlbuilder.add() 方法,在這個方法里,clssqlbuilder首先取得該對象的類型
在這里是 “clsteacher” 這個類型字符串和 db.xml 文件中 tblteacher 有一一對應的關系,這里是去掉前綴 cls,加上前綴 tbl.你也可以用其它更靈活的方法,如:把映射關系記錄到文件中.
然后遍歷db.xml文件中的tblteacher 表的所有行,其中用到反射方法,以 在知道對象屬性名稱的情況下取得該屬性的值(這其中我也波折了一下,開始用 invokemember調用,好麻煩.最后發現竟然有一個 callbyname的方法,用起來特簡單.其實它也是封裝了invokemember,).最終生成這樣的sql語句返回.
insert into tblteacher(name,code,gender…) values (‘haha’,’2001’,1…)
(有幾點要注意,在add/delete/update不同的操作方法里面,對數據表字段有不同的要求.比如在添加時,不能對自動編號id賦值,所以上面的sql語句就沒有id字段.這里我只用了seek和key的字段屬性,其實還可以添加其它屬性,如數字型的最大值,字符型驗證的正則表達式.以在clssqlbuilder中完成數據驗證操作)
最后clsdataaccessoper.add 方法用這個sql語句連接數據庫,進行操作.
clsdataaccessoper和clssqlbuilder我就不詳細解說了.代碼都貼出來了,自己看吧