轻松搞定数据访问层

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體:   |    |    |  超大  

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

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航