日期:2012-05-10  浏览次数:20396 次

下面实现的方法,可以把你从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 的成员就可以了,当然还涉及一些数据

晚期填充以提高效率的技巧,在这里就不详细介绍了)


数据库表

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