这半年手头的一个项目,自己写代码的时候偏爱 MS SQL、部署服务器装的是 ORALCE 和 实际的现场是小型机,压根没有装数据库只好选用 ACESS ,三种环境不一致,才决定用 OLEDB 做数据库访问。之前忙于赶进度草草地封了几个增删改查的操作,年前闲下来做测试还发现了不少问题。趁着这几天闲就从头封装了一次,做出单独的一个简单类出来。
为了调用的时候传递方便就直接从 IDbCommand 继承过来,这样传参还是调用都留下了余地,封装很简单直接上类图
本文的小工具和封装类,已经提交到了GIT
Toater_OSC Git 中的 DataBaseAcess 工程里
这个版本的封装提供了俩个简单的选项
1.是否保持连接
执行命令后是否关闭连接的选项,因为发现在使用 ACESS 的时候如果频繁打开关闭文件,指不定就会遇到 IO导致的错误,下面来由一组测试来说明 ACESS 在保持连接的情况下执行效率竟然超过了俩种主流数据库。
2. 数据库类型选择
/// <summary> /// /// <summary> /// 构造函数 /// </summary> /// <param name="connectionString">连接字符串</param> /// <param name="dbType">数据库类型</param> /// <param name="keepAlive">是否保持连接</param> public DBFairy(string connectionString, string dbType = DBType_Oracle, bool keepAlive = false) { // 非默认值检查关键字匹配 if (!string.IsNullOrEmpty(dbType)) { if (DBType_Oracle != dbType && DBType_MSSQL != dbType && DBType_ACCESS != dbType) { throw new NotSupportedException("不受支持的类型描述,请使用 DBFairy.DBType 定义."); } _DBType = dbType; } _ConnectionString = connectionString; _AlwaysClose = !keepAlive; dbCommand.Connection = new OleDbConnection(_ConnectionString); }
测试了支持选项中的三种数据库,下面是测试过程。
环境是 : Acer 台式机 ,I3 CPU ,4G 内存
方法是 : 三个后台线程,同时执行 数据库操作
不过我还是很偏心地把 ACCESS 地调用放在了第一位,实在是因为大家都说小伙子太慢,才爱心地放在了第一位。
bgAcessWorker.RunWorkerAsync(); bgMSWorker.RunWorkerAsync(); bgOracleWorker.RunWorkerAsync();
在关闭连接的情况下的三次测试:
第一次:
第二次:
第三次:
在关闭连接的情况下 : MS SQL 和 Oracle 相差无几,不过感觉上还是 ORACLE 略快, ACESS 操作时间基本在 2倍以上
问题 : 为毛 ACCESS 执行越来越快了?难道这是文件 IO 缓存的问题,或者进程调度优先了文件?
在保持连接状态下的三组测试:
第一次 : MSSQL和ORACLE基本还好之前的相差无几的感觉,不过可以看出来,这里的时间已经从 17000 减少到了 15000 ,不过在服务型的数据上,开关连接的损失不是很大。
再看一下 ACESS 明显已经逆天了,直接秒杀了俩位老大。只用了10075 ,10秒左右插入了 1000 条记录。
第二次:
第三次:
可能看到同事们纷纷离开工位,回家过年了,电脑也激动地越来越卡了,1000行的执行时间越来越长,不过对比结果还是很明显的.
ACESS 在保持连接的状态下,小量数据的插入速度还是很快的,赶超过了 MS SQL 和 ORACLE 。后俩者一直很默契,不离不弃地保持着不分不舍的步调。
(估计是今天情人节的原因吧 ^_^)
----------------------------------------------------------- MARK ----------------------------------------------------------------
------ MS SQL 这里用的附加数据库 ,VS 2013 自带了 虚拟 SQL的功能 <add name="OLEDBConnectionString" connectionString="Provider=SQLNCLI11.1;Data Source=(LocalDB)\V11.0;Persist Security Info=False;Integrated Security=SSPI;Initial File Name=E:\OSChina\Source\Repos\Thenu.TinyHourseLib\THenu.TinyHourseLib\DataBaseAcess\WindowsFormsAcess\App_Data\StudentDB.mdf" providerName="System.Data.OleDb" /> --- ORACL <add name="OracleConnectionString" connectionString="Provider=MSDAORA.1;Data Source=orcl;Persist Security Info=True;Password=hhkj;User ID=hhkj" providerName="System.Data.OleDb" /> --- ACESS <add name="AccessConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\OSChina\Source\Repos\Thenu.TinyHourseLib\THenu.TinyHourseLib\DataBaseAcess\WindowsFormsAcess\App_Data\Student.mdb" providerName="System.Data.OleDb" />
关于连接字符串,大家跟据自己的版本,选择好 Provider , SQL 2005,2008 和 2012 使用不同的,而且对于服务数据和附加数据库也有一点区别。Oracle 的常用的就是上面的方式,当然也可以选择 Oralce 自己的OLEDB Provider 。
给大家推荐一个很全的连接字符串参考网站:
问题汇总部分实在来不及写了, 不要骂我是骗子,着急中午回家洗袜子 就这一双明天早上还要穿的,这部分年后再补录吧
今天是情人节外加回家的大日子,作为资深屌丝也是有很多正事要做的
@MISS BingBing
各位OSCer 新年快乐,羊年吉祥,喜洋洋、美羊羊、懒洋洋,我是灰太狼。。。。