公共数据库访问DBHelper - Rainr.Dam.dll
时间:2010-12-21 来源:Rainr
数据库的初期打算当然是只在一种数据库上操作。 但日后想移植到别的数据库 如 mysql等。是不是又得写一个对于此种访问的Helper,修改数据库访问的部分代码,来达到数据库移植。对于小网站来说,抽象工厂好像大了点。有点麻烦。
之后就想写一个公用的DBHelper。完全基于ADO.NET操作。不像 ORM等般庞大。用它来实现不同种类数据库的访问。岂不是妙哉。
刚开始预建特点:
- 不修改数据库访问层的任何代码,只需要修改配置文件的一个配置属性便可以实现跨不同数据库访问。
- 基于原生ADO.NET提供的方法。(感觉已经够了)
- 性能不能损失太大。
- 操作灵活,事务,单连接执行多项任务等.
- 支持任何实现了DBConnection等抽象类的数据库访问组件的数据库.
- 创建数据库链接基于两种方式 Basic,Reflex普通的和反射创建。 所谓基本就是早期绑定引用的dll.用if else 判断配置文件进行创建链接。 第二种通过配置文件直接反射链接对象.
- 可 使用静态和 实例方法访问。 静态就是直接使用类的静态方法访问。 实例 是重新活的本类的一个新实例进行访问。(这个无非是拷贝下方法呵呵)
- 实现对访问数据库参数对象的转换。用于试用当前链接的类型。
- 事务和参数值能灵活处理一点。
欲实现的困难点:
- 不同数据库的操作语句都不尽相同。造成了SQL语句的转换困难。
- 想通过写一个解析转换器实现多种数据库SQL语句的转换工作。(估计写出来能和MS的中间语言相媲美了。嘿嘿 玩笑。) 不但困难,即使写出来了,这也就不能提供所有任何实现了Ado.net组件的数据库连接组件连接数据库了。 看起来这个困难点还不是一般的困难。
想法图:
实现的过程中,感觉好像没写什么,代码写的很少,很粗略。期望以后能深入一点实现更加细腻更加灵活的数据访问。
其中本来想的Factory工程类中的 Basic方式,因为是早期绑定。dll都是提前引用好的,但是对于有的机器可能没有此dll(例如sqlite.dll)或者根本就用不到这种数据库访问,那样必然会异常。所以最终还是废弃了。改用同种程序集第一次使用反射程序集。之后都是直接从内存序列里取已反射过的程序集,通过它来创建连接。
实现之后的图:
配置文件的修改:
appSettings 配置节下:
添加一个 <add key="damconnection" value="mssql"/>
value属性为 connectionStrings下的链接名称name
connectionStrings配置接下:
<add name="mssql" connectionString="ServerAddress..." providerName="System.Data.SqlClient.SqlConnection;System.Data.dll" />
providerName属性需要修改为 "[命名空间.类名][;][程序集的名称]" 。
测试代码:
1 //简单访问代码
2 private int testExec()3 {
4 try
5 {
6 DbParameter[] paras = new DbParameter[2];
7 paras[0] = new MySqlParameter("inp", "hello") { Size = 50 };
8 //这里参数可以随意些,后便会统一转换成Connection对对应的参数类型
9 paras[1] = new SqlParameter("inpt", "") { Direction = ParameterDirection.Output, Size = 16 };
10 //参数集合可以从BLL层传进来.
11 return Execute.SExecuteNonQuery("proc_insertLine", paras);
12 //如果要获取output参数的值的话,可以这样做
13 //string outputpValue= pasas[1].Value.ToString();
14 }
15 catch (Exception)
16 {
17 //throw;
18 return 0;
19 }
20 }
1 //事务访问方法
2 private void testTransaction()3 {
4 DbConnection connection = null;
5 DbTransaction transaction = null;
6 Execute exec = Execute.Instance;
7 try
8 {
9 connection = Factory.CreateConnection();
10 connection.Open();
11 transaction = connection.BeginTransaction();
12 //int e1 = Execute.SExecuteNonQuery(connection, transaction, "insert into testtable (inp,outp,inoutp)values('inp1',11,'inoutp1')", CommandType.Text, null);
13 //int e2 = Execute.SExecuteNonQuery(connection, transaction, "insert into testtable (inp,inoutp)values('inp2',22,'inoutp2')", CommandType.Text, null);
14 DbParameter[] paras = new DbParameter[2];
15 paras[0] = new MySqlParameter("inp", "hello") { Size = 50 };
16 paras[1] = new SqlParameter("inpt", "") { Direction = ParameterDirection.Output, Size = 16 };
17 int e2 = exec.ExecuteNonQuery(connection, transaction, "proc_delete", CommandType.StoredProcedure, null);
18 int e1 = exec.ExecuteNonQuery(connection, transaction, "proc_insertLine", CommandType.StoredProcedure, paras);
19 transaction.Commit();
20 //当然如果是用存储过程的话还是建议直接在存储过程中是用事务来处理.
21 }
22 catch (Exception)
23 {
24 if (transaction != null)
25 {
26 transaction.Rollback();
27 }
28 throw;
29 }
30 finally
31 {
32 if (connection != null)
33 {
34 connection.Close();
35 connection.Dispose();
36 }
37 }
38 }
测试组件:有时间的朋友也可以测试下,嘿嘿
Rainr.Dam.rar
最后:虽然这个组件非常简陋,可能实用性不大。但我想它也凝聚了我有过的一些思想和小的想法。 希望小白的我能在博客园的大环境中同很多朋友一起学习进步。争取能做出更好的东西!