• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

民工的家

Jackyli.918@hotmail.com
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

HKH小类库系列(一) 数据库访问层设计思路及使用方法

本文介绍了HKH.DataProvider实现思想及使用方法,简单方便,切换不同数据库只需要稍改动配置即可。 对事务进行封装,使用更简单。 对连接字符串提供默认加密算法。 对其它数据库扩展支持极其简单,只需要提供对应的connection.command的方法即可。

曾经做过一个要求跨库访问的项目,在当时1。1版本时就出来了这个设计,现在进行了重构,发出来与大家共享:

 

一、设计思路(面向接口编程,中间夹杂着工厂和创建者模式)

整体类关系图:(忽略中间的部分抽象类,主要是思想描述)

 

其中左边DataProvider系列接口和类是对外提供数据访问接口的,里面提供了大量的ExecuteNonQuery,ExecuteDataReader等各种数据访问方法的重载,

右边的DbObjectBuilder系列接口和类是构建Connection,Command等数据库访问对象的,提供给DataProvider来使用,我们可以通过实现IDataProviderObjectBuilder来支持其它的数据库,比如Oracle和MySql。

 

其中使用何用数据库是在配置文件中指定的,示例如下

 

代码
    <configSections>
        
<section name="dataProviderConfigurations" type="HKH.DataProvider.Configuration.DataProviderConfigurationSectionHandler,HKH.DataProvider"></section>
    
</configSections>
 
<dataProviderConfigurations>
        
<dataProviderConfiguration name="sqlConn" builder="HKH.DataProvider.SqlServer.SqlServerObjectBuilder,HKH.DataProvider" default="true">
            
<param name="ConnectionString" value="A8C565FE2A93B932AC934D03DDF5485276DA60475F2DD479864F3EEEFD07B5BFC7E815031AEC3F0692AD5F563126ADB49DC6F7450DD975776208966B8499C749FF67B9639CE88CB7DFEB7EDDDCD6B445B54FAF93CBFD8AAC4BAC6D0C15A804C4355F2413EA2C445345ADC5B1BB27D822" encrypt="true"/>
            
<!--<param name="ConnectionString" value="Data Source=192.168.8.106\SqlExpress;Initial Catalog=NUnit;User ID=sa;Password=sa;Integrated Security=false;" encrypt="false"/>-->
            
<!--<param name="Data Source" value="192.168.8.106\SqlExpress" />
            <param name="Initial Catalog" value="NUnit" />
            <param name="User ID" value="sa" />
            <param name="Password" value="sa" />
            <param name="Integrated Security" value="false" />
            <param name="Connect Timeout" value="60" />
            <param name="EnList" value="false" />
-->
        
</dataProviderConfiguration>
    
</dataProviderConfigurations>

 

 

首先是自定义配置节处理程序配置,接下来就是连接字符串配置,其中Builder属性要求提供DbObjectBuilder类,格式"ClassName,AssemblyName",

Default属性指定当我们在程序不提定配置名时,将返回此连接,下边是连接参数配置,三种选择:

1。逐个参数配置,

2。连接字符串配置

3。混合使用

encrypt属性,连接字符串/参数值是否被加密,加密使用AES算法 至于加密K和V,可以去源代码AesDbEncryption类中修改,DBEncryptTool可以帮助生成加密字符串

二、使用方法

 DataProviderFactory类的方法GetDataProvider()方法将返回IDataProvider对象供外部访问数据库,在其不同重载函数中需要注意的是:如果你传进去的参数是一个在config文件配置好的,该对象在创建后将被缓存;如何传的参数是一个完整的连接字符串,该对象将不会被缓存,因为某些时候我们只想访问一次数据库。

 

TransactionHelper类封装了事务处理,可以方便的处理事务启动和回滚。使用方法如下:

 

代码
IDataProvider provider = DataProviderFactory.GetDataProvider();

using (TransactionHelper helper = new TransactionHelper(transaction))
            {
                provider.ExecuteNonQuery(
"sql1", helper.Transaction);
provider.ExecuteNonQuery(
"sql2",helper.Transaction);

                helper.TryCommitTransaction();
            }

 

 

我们只要将TransactionHelper类的Transaction属性做为事件在方法间传递,并在最后执行TryCommitTransaction方法即可,如果方法执行成功,在最后就会被提交,如果方法有异常产生,在using结束时,事务会被执行回滚。

 

众多接口,可能有过度设计之嫌,但使用一直良好,众位高手有何意见或建议请留言赐教。

 

 

框架下载地址:

HKH类库:/Files/Jackyli/HKHProjects.rar

 

posted on 2010-03-19 14:50  JackyLi  阅读(553)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3