

Java技术
2005: 03 04 05 06 07 08
09 10 11 12
2006: 01 02
Asp.net
2005: 07 08 09 10 11 12
2006: 01 02

数据库表
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=”
.Gender=True
…
End With
clsTeacherOper.Add(newTeacher)
添加一个学生
Dim newStudent as new clsStudent
With newStudent
.Name=”Tom”
.Gender=True
.TeacherCode=”
…
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’,’
(有几点要注意,在Add/Delete/Update不同的操作方法里面,对数据表字段有不同的要求.比如在添加时,不能对自动编号ID赋值,所以上面的SQL语句就没有ID字段.这里我只用了Seek和Key的字段属性,其实还可以添加其它属性,如数字型的最大值,字符型验证的正则表达式.以在clsSQLBuilder中完成数据验证操作)
最后clsDataAccessOper.Add 方法用这个SQL语句连接数据库,进行操作.
clsDataAccessOper和clsSQLBuilder我就不详细解说了.代码都贴出来了,自己看吧