创建一个数据库类型无关的DBHelper实例
在原始的ado.net框架中,不同的数据库有不同的类型的命名空间和类。例如创建一个数据库连接对象,对于SQLSERVER使用SqlConnection,对于ODBC使用OdbcConnection。在著名的petshop示例程序中,为了使系统能适应不同的数据库,还专门在数据访问层抽象出一个通用的模型,然后根据不同的数据库类型分别设计出具体的实现。
在DBHelper2中,不同的数据库类型可以使用同一个编程模型,其中的属性和方法已包括.NET内置支持的全部数据库类型(包括:SQLSERVER,ODBC,OLEDB等),不需要重新根据数据库类型单独设计。对于.NET没有内置支持的数据库(如:ORACLE,MYSQL等),只需要通过继承DBHelper类,实现其中少量的数据库差异功能即可扩展。
一、使用DBFactory创建DBHelper实例
DBFactory类提供了一个静态方法CreateDBHelper,可以根据配置文件的连接串来创建所需要的DBHelper实例。
'使用DBFactory创建DBHelper实例
'指定数据库连接串,根据连接串的providerName来确定数据库类型,默认为SQLSERVER
Using db As DBHelper = DBFactory.CreateDBHelper("ConnectionString")
End Using
其中CreateDBHelper的参数“ConnectionString”是指在web.config文件中<connectionStrings>配置节中的的数据库连接串的名称。具体配置如下:
<add name="ConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=AdventureWorks2012_Data.mdf;Integrated Security=True;" providerName="SQLHelper"/>
其中providerName属性给出了这个数据库的类型。如果此属性缺省,则默认为SQLSERVER。
providerName | 数据库类型 |
SQLHelper | SQLSERVER |
ODBCHelper | 通过ODBC连接的数据库 |
OLEDBHelper | 通过OLEDB引擎访问的文件型数据库 |
在数据库连接串中,除了ado.net约定的几项以外,dbhelper还能识别以下字段:
连接串字段 | 说明 |
CommandTimeOut | 数值型。SQL命令执行的时限,单位是秒。SQL命令执行超过此时限将抛出CommandTimeout异常。默认30秒。 |
ConvertNullToEmpty | 布尔型。对于字符型字段:当该值为True时,读取数据库中的DBNull会得到String.Empty,否则,得到一个null。 默认True,此时通过DBHelper获得的字符型数据不会有空值出现,可省去了大量判断空值的操作。 |
ConvertEncoding | 布尔型。专门针对Informix出现的中文乱码问题(另文专述)。对于CSDK 2.7以上版本如果出现了乱码,需要设置该值为True。默认False。 |
二、DBHelper类的主要功能
DBHelper是一个数据库工具集,它主要包括以下几类方法和属性:
1、数据库状态类
方法 | 说明 |
Open | 打开数据库连接。不需要显式操作,凡是需要的地方会自动打开。 |
Close | 关闭数据库连接。如果不显式操作,当DBHelper对象被回收时自动执行关闭操作。 |
BeginTransaction | 开启一个事务 |
CommitTransaction | 提交一个事务 |
RollbackTransaction | 回滚一个事务 |
2、继承Ado.net的ExecuteXXX方法
上文介绍过ExecuteNonQuery, ExecuteReader, ExecuteScalar等方法,和ado.net的同名方法不同,dbhelper提供的方法与数据库无关,可直接传入多个SQL参数的值
3、ORM(对象-关系映射)类方法
方法 | 说明 |
Load | 根据简单对象的主键值从数据库中读取一条记录填入到简单对象中。 |
Save | 将简单对象的值保存到数据库对应的表中。如果主键值存在则更新记录,否则是插入新记录 |
Remove | 根据简单对象的主键值删除数据库中对应的记录 |
ReadEntity | 使用原生SQL从数据库中读取一个简单对象的值 |
4、集合操作类方法
方法 | 说明 |
ReadTable | 从数据库中读取数据后装入到一个内存中的数据表 |
SaveTable | 将内存数据表中的数据全部保存到数据库 |
ReadList | 读取数据库数据后装入一个简单对象的List |
SaveList | 将简单对象的List保存到数据库 |
WriteTo | 将一个数据库的记录集保存到另外一个数据库中指定表的同名字段中。这两个数据库可以是异构的。 |
5、数据类型转换类
使用ado.net从数据库中读取数据时,得到的值是object类型的,需要应用程序来装箱。装箱时还要判断数据是否为空值,是否合法等繁琐的工作。dbhelper提供了一系列类型转换函数,可以直接将数据库的数据转换成需要的类型,自动判断数据有效性。
方法 | 说明 |
ReadStr | 转为字符串并转码,清除尾部空格。 |
BoolToStr | 布尔值转字符:True=Y,False=N |
BoolToInt | 布尔值转整型:True=1,False=0 |
ReadBool | 字符型转布尔型 |
ReadDate | 转为日期,DBNULL转为空值 |
ReadLng | 转为长整型,无效时为空值 |
ReadInt | 转为整型,无效时为空值 |
ReadShort | 转为短整型,无效时为空值 |
ReadSng | 转为单精度浮点数,无效时为空值 |
ReadDbl | 转为双精度浮点数,无效时为空值 |
ReadDec | 转为十进制数,无效时为空值 |
ReadObj | 把DBNULL转换为NULL |
WriteStr | 字符串写入数据库,空串转为DBNULL,并转码 |
WriteDate | 日期型转为数据库类型。空值和20世纪以前转为数据库空值 |
WriteBool | 不能识别为布尔型的值转为空值 |
WriteDbl | 不能识别为浮点数的值转为空值 |
WriteDec | 不能识别为十进制数和值转为空值 |
WriteInt | 不能识别为整型数的值转为空值 |
WriteLng | 不能识别为长整型数的值转为空值 |
WriteShort | 不能识别为短整型数的值转为空值 |
WriteSng | 不能识别为单精度浮点数的值转为空值 |
WriteObj | 空值转为DBNULL |
DateTimeStrToDate | 日期型+字符型时间转换为Date型 |
D8ToDate | 8位数字转为日期 |
D14ToDate | YYYYMMDDHHmmSS格式的14位数字转为日期 |