快讯
- 游泳也需音乐相伴!韶音OpenSwim Pro评测
- 又一款轻量化电竞
- 元气满满的充电之旅!铂陆帝商超活动嗨翻周末
- 雷柏机甲编码主题系列警戒线S-07图赏:以机械美感诠释潮流新理念桌搭!
- 更适合新手体质的枪战游戏,《无畏契约》开战!
- 现代与传统的融合之旅:贝尔金笔记本扩展坞体验
- 航天品质下的极速充电体验——航嘉G65 GaN快速充电器评测
- 有颜有实力的外设谁能不爱?来看雷柏商超巡演
- 新潮外设引爆全场!雷柏联合PC打造潮品酷玩趴
- 幻彩绚丽,玩趣十足!雷柏V700DIY键盘图赏
- U皇就该配板皇,超频玩家现身说法教你选主板
- 13代酷睿的超频利器,有好板才有好性能
- 全新升级,雷柏V20S RGB光学游戏鼠标2023版详解
- 马斯克30亿放“烟花”,民航故事为何值钱?
- 让露营生活更精致!铂陆帝户外电源AC180评测
- 惠威音响体验:音响中的艺术品,拥有好听的灵魂
- HiFi级音响用料 仙籁 N8音响专用交换机售2980元
- 高品质听音 仙籁 M1T 纯数字音乐播放器促销5000元
- 高质量音源 仙籁 B2网络数字音乐播放器促销3480元
- 纯白雅致的羽量级旗舰游戏外设—雷柏VT9白色版
- 游泳也需要音乐相伴!韶音新一代游泳耳机OpenSwim Pro评测12日
- 又一款轻量化电竞"神鼠"来袭!玄熊猫3395游戏鼠标今晚首发149元10日
- 元气满满的充电之旅!铂陆帝商超活动嗨翻周末27日
- 雷柏机甲编码主题系列警戒线S-07图赏:以机械美感诠释潮流新理念桌搭!24日
- 更适合新手体质的枪战游戏,《无畏契约》国服正式开战!20日
- 玩物近话论:现代科技与甘南秘境的融合之旅 贝尔金笔记本扩展坞体验14日
- 航天品质下的极速充电体验——航嘉G65 GaN快速充电器评测12日
- 有颜有实力的外设好物谁能不爱?雷柏点燃PCGROUP潮品商超巡演15日
- 新潮外设好物引爆全场!雷柏联合PCGROUP打造潮品酷玩趴15日
- 幻彩绚丽,玩趣十足!雷柏V700DIY热插拔机械键盘图赏10日
- U皇就该配板皇,超频玩家现身说法教你选主板26日
- 13代酷睿的超频利器,有好板才有好性能25日
- 全新升级 经典复刻 雷柏V20S RGB光学游戏鼠标2023版详解25日
- 马斯克30亿放“烟花”,民航故事为何值钱?23日
- 告别电量焦虑,让露营生活多一分精致!铂陆帝户外电源AC180开箱评测17日
- 惠威音响体验:音响中的艺术品,拥有好听的灵魂04日
- HiFi级音响用料 仙籁 N8音响专用交换机售2980元27日
- 高品质听音 仙籁 M1T 纯数字音乐播放器促销5000元27日
- 高质量音源 仙籁 B2网络数字音乐播放器促销3480元27日
- 纯白雅致的羽量级旗舰游戏外设——雷柏VT9双模无线游戏鼠标白色版上市23日
使用设计模式构建通用数据库访问类
2004-02-14 09:34 出处:PConline 作者:佚名 责任编辑:ycx
1回顶部 在应用程序的设计中,数据库的访问是非常重要的,我们通常需要将对数据库的访问集中起来,以保证良好的封装性和可维护性。在.Net中,数据库的访问,对于微软自家的SqlServer和其他数据库(支持OleDb),采用不同的访问方法,这些类分别分布于System.Data.SqlClient和System.Data.OleDb名称空间中。微软后来又推出了专门用于访问Oracle数据库的类库。我们希望在编写应用系统的时候,不因这么多类的不同而受到影响,能够尽量做到数据库无关,当后台数据库发生变更的时候,不需要更改客户端的代码。
有的时候,为了性能和其他原因,我们也希望提供对数据库访问的缓存,特别是数据库连接的缓存。虽然微软给我们内置了数据库缓存,但是,自己控制缓存,无疑可以提供更大的灵活性和效率。
这就需要我们在实际开发过程中将这些数据库访问类再作一次封装。这里,介绍一种在实际应用中得到了非常好的效果的实作策略。Factory和Silgleton设计模式是使用的主要方法。
我们先来看看Factory的含义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。我们这里可能会处理对多种数据库的操作,因此,需要首先定义一个操纵数据库的接口,然后,根据数据库的不同,由类工厂决定实例化哪个类。
下面,我们首先来定义这个访问接口。为了方便说明问题,我们为这个类定义了比较少的方法,其他的方法是很容易参照添加的。同时注意,我这里使用了abstract class来定义这个访问接口,而不是interface,理由在后面可以看到。
public abstract class DBOperator
{
public abstract IDbConnection Connection{get;} //得到数据库连接
public abstract void Open(); //打开数据库连接
public abstract void Close(); //关闭数据库连接
public abstract void BeginTrans(); //开始一个事务
public abstract void CommitTrans(); //提交一个事务
public abstract void RollbackTrans(); //回滚一个事务
public abstract void exeSql(string strSql,string[] strParams,object[] objValues);
//执行Sql语句,没有返回值
public abstract DataSet exeSqlForDataSet(string QueryString);//执行Sql,返回DataSet
}
2回顶部
然后,我们分别为Sql Server和OleDb数据库编写两个数据访问的具体实现类:
Sql Server的数据库访问类:
internal class SqlDBOperator: DBOperator
{
private SqlConnection conn; //数据库连接
private SqlTransaction trans; //事务处理类
private bool inTransaction=false; //指示当前是否正处于事务中
public override IDbConnection Connection
{
get{return this.conn;}
}
public SqlDBOperator(string strConnection)
{
this.conn= new SqlConnection(strConnection);
}
public override void Open()
{
if(conn.State.ToString().ToUpper()!="OPEN")
this.conn.Open();
}
public override void Close()
{
if (conn.State.ToString().ToUpper()=="OPEN")
this.conn.Close();
}
public override void BeginTrans()
{
trans=conn.BeginTransaction() ;
inTransaction=true;
}
public override void CommitTrans()
{
trans.Commit();
inTransaction=false;
}
public override void RollbackTrans()
{
trans.Rollback();
inTransaction=false;
}
public override void exeSql(string strSql,string[] strParams,object[] strValues)
{
SqlCommand cmd=new SqlCommand();
cmd.Connection=this.conn ;
if(inTransaction)
cmd.Transaction=trans;
if((strParams!=null)&&(strParams.Length!=strValues.Length) )
throw new ParamValueNotMatchException("查询参数和值不对应!");
cmd.CommandText=strSql;
if(strParams!=null)
{
for(int i=0;i5回顶部
实际上,Factory模式也可以不使用Factory类来实现,而是让接口抽象类自己来管理,这可以称作自管理的Factory,是Factory模式的一种变形。这么做的好处,是可以免去一个Factory类,使代码更加简练。这么做,我们需要对DBOperator类做一些改变,增加一个Instance方法。这也是对DBOperator采用抽象类而不是接口的原因(接口的方法不能有实现),代码如下:
public static DBOperator Instance(string strConnetion)
{
if(strConnection.IndexOf("provider=")<0) //SqlServer
{
return new SqlDBOperator(strConnection);
}
else //other database
{
return new OleDBOperator(strConnection);
}
}
然后,客户端代码就可能是类似于下面的形式:
DBOperator db= DBOperator.Instance(strConnection)
db.Open();
db.需要的操作
db.Close();
下面来看看连接池的做法,方法就是Singleton。
先看Singleton模式的经典含义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。推而广之,当我们需要精确控制类在系统中的实例的个数的时候,就可以使用Singleton模式。现在,我们需要构建一个缓冲池,保存数据库类的实例,正好是Singleton模式发挥作用的时候。
我们仍然让DBOperator类自己来管理这个缓冲池,为了实现这个目的,我们需要对DBOperator类做一些变化:
首先,增加两个变量:
static DBOperator[] ConnectionPool=new
DBOperator[int.Parse(ConfigurationSettings.AppSettings["PoolCount"])];
static int CurrentPosition=-1;
然后,对Instance方法做一些改变:
public static DBOperator Instance(string strConnection)
{
if(ApplicationConfiguration.PooledConnectionCount<1) //没有缓冲
{
return CreateNewDBOperator(strConnection);
}
else
{
CurrentPosition++;
if(CurrentPosition==ApplicationConfiguration.PooledConnectionCount)
CurrentPosition=0;
if(ConnectionPool[CurrentPosition]==null)
{
ConnectionPool[CurrentPosition]=CreateNewDBOperator(strConnection);
}
return ConnectionPool[CurrentPosition];
}
}
private static DBOperator CreateNewDBOperator(string strConnection)
{
if(strConnection.IndexOf("provider=")<0) //SqlServer
{
return new SqlDBOperator(strConnection);
}
else //other database
{
return new OleDBOperator(strConnection);
}
}
这里使用的算法比较简单,只是为了能够比较清楚地说明问题,读者应当能够在实际使用过程中,实现更好的算法。
以上,介绍了一种通用数据库操作类的实现设计方法,希望能够对大家有所启发。笔者设计Websharp中间件的时候,在数据库处理层,采用了上面的方法,取得了很好的效果。(孙亚民/ASPCool)
|
本周
本月
-
1
win10vpn在哪里连接 win10vpn连接方法【详解】
2楼 -
2
%E8%8A%B1%E5%91%97%E6%80%8E%E4%B9%88%E5%A5%97%E5%87%BA%E7%8E%B0%E9%87%91%E3%80%90%E8%AF%A6%E8%A7%A3%E3%80%91
2楼 -
3
%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%BB%80%E4%B9%88%E5%9C%B0%E6%96%B9%E4%BD%BF%E7%94%A8%EF%BC%9F%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E6%80%8E%E4%B9%88%E6%8F%90%E7%8E%B0%E5%87%BA%E6%9D%A5%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D
1楼 -
4
%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E8%81%94%E7%B3%BB%E5%AE%A2%E6%9C%8D%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D%20%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E5%A5%BD%E7%94%A8%E5%90%97
1楼 -
5
ps清理剪贴板技巧分享
1楼 -
6
局域网内网速度慢的原因及解决方法
1楼 -
7
InDesign栏线插入教程分享
1楼 -
8
抖音怎么破解对方的隐私设置 强制看对方隐藏的抖音号方法【详解】
1楼
IT热词搜索
来源:360新闻
软件论坛帖子排行
最高点击
最高回复
最新
-
1
win10vpn在哪里连接 win10vpn连接方法【详解】
楼 -
2
%E8%8A%B1%E5%91%97%E6%80%8E%E4%B9%88%E5%A5%97%E5%87%BA%E7%8E%B0%E9%87%91%E3%80%90%E8%AF%A6%E8%A7%A3%E3%80%91
楼 -
3
%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%BB%80%E4%B9%88%E5%9C%B0%E6%96%B9%E4%BD%BF%E7%94%A8%EF%BC%9F%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E6%80%8E%E4%B9%88%E6%8F%90%E7%8E%B0%E5%87%BA%E6%9D%A5%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D
楼 -
4
%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E8%81%94%E7%B3%BB%E5%AE%A2%E6%9C%8D%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D%20%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E5%A5%BD%E7%94%A8%E5%90%97
楼 -
5
ps清理剪贴板技巧分享
楼 -
6
局域网内网速度慢的原因及解决方法
楼 -
7
InDesign栏线插入教程分享
楼 -
8
抖音怎么破解对方的隐私设置 强制看对方隐藏的抖音号方法【详解】
楼
-
1
win10vpn在哪里连接 win10vpn连接方法【详解】
楼 -
2
%E8%8A%B1%E5%91%97%E6%80%8E%E4%B9%88%E5%A5%97%E5%87%BA%E7%8E%B0%E9%87%91%E3%80%90%E8%AF%A6%E8%A7%A3%E3%80%91
楼 -
3
%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%BB%80%E4%B9%88%E5%9C%B0%E6%96%B9%E4%BD%BF%E7%94%A8%EF%BC%9F%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E6%80%8E%E4%B9%88%E6%8F%90%E7%8E%B0%E5%87%BA%E6%9D%A5%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D
楼 -
4
%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E8%81%94%E7%B3%BB%E5%AE%A2%E6%9C%8D%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D%20%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E5%A5%BD%E7%94%A8%E5%90%97
楼 -
5
ps清理剪贴板技巧分享
楼 -
6
局域网内网速度慢的原因及解决方法
楼 -
7
InDesign栏线插入教程分享
楼 -
8
抖音怎么破解对方的隐私设置 强制看对方隐藏的抖音号方法【详解】
楼
-
1
win10vpn在哪里连接 win10vpn连接方法【详解】
楼 -
2
%E8%8A%B1%E5%91%97%E6%80%8E%E4%B9%88%E5%A5%97%E5%87%BA%E7%8E%B0%E9%87%91%E3%80%90%E8%AF%A6%E8%A7%A3%E3%80%91
楼 -
3
%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%BB%80%E4%B9%88%E5%9C%B0%E6%96%B9%E4%BD%BF%E7%94%A8%EF%BC%9F%E5%BE%AE%E4%BF%A1%E5%88%86%E4%BB%98%E6%80%8E%E4%B9%88%E6%8F%90%E7%8E%B0%E5%87%BA%E6%9D%A5%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D
楼 -
4
%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E8%81%94%E7%B3%BB%E5%AE%A2%E6%9C%8D%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D%20%E5%92%AA%E5%92%95%E5%96%84%E8%B7%91%E5%A5%BD%E7%94%A8%E5%90%97
楼 -
5
ps清理剪贴板技巧分享
楼 -
6
局域网内网速度慢的原因及解决方法
楼 -
7
InDesign栏线插入教程分享
楼 -
8
抖音怎么破解对方的隐私设置 强制看对方隐藏的抖音号方法【详解】
楼
推广内容
汽车资讯
最热搜索
无线路由器怎么用 会说话的汤姆猫电脑版 12306网上订火车票 跳舞吧 flash player 下载 PP助手电脑版 Adobe Reader(pdf阅读) iOS6正式版12项新功能 QQ空间克隆器 9158视频KTV 植物大战僵尸辅助工具 Win8怎么关机 QQ空间进不去 2013年春节是几月几号 QQ昵称 QQ空间皮肤 PPT模板 电脑输入法不见了怎么办 2012中秋节是几月几日 word安全模式 qq输入法怎么点亮 IE修复 感恩节是几月几日 CSS布局 PS快捷键 Outlook设置 声卡驱动器官方免费下载 格式工厂怎么用 桌面图标有阴影怎么去掉 Windows RT是什么意思 2013年日历设计 Word打不开怎么办 Win8专区 腾讯微云网 windows8激活工具 剑灵什么时候公测 QQ通讯录怎么用 开心斗地主 拖拉机小游戏 麻将游戏 中国象棋 德州扑克 黄金矿工中文版 保皇扑克游戏 四国军棋 万圣节是几月几日 ps抠图教程 12306订票助手 万圣节小游戏大全 rar文件怎么打开 Photoshop CS6教程 iOS6完美越狱 QQ个性签名