轻松搞定数据访问层

写在前面:
其实这里的两篇数据访问层的文章都不是我写的,但我在搞数据访问层的时候参考了这两篇文章。其实我是用MS的SqlHelper类来进行底层数据访问,然后自己做一个DAL层。
有空了,我把我的方法写出来,与大家共享!
一笑
2004-10-18

下面实现的方法,可以把你从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

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

<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 117pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 17.25pt; BAC

Published At
Categories with Web编程
Tagged with
comments powered by Disqus