数据库表
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我就不详细解说了.代码都贴出来了,自己看吧