在.net中利用数据工厂实现多数据库的操作

在项目的开发过程中,在设计模式的概念还没有出来时,我们那时候在编写程序时,往往如果项目的数据库是采用SQL Server,然后用户又想换其它数据库如Oracle时,我们就需要对其代码进行重写,特别是在一些软件的产品化道路中,我们做出来的产品如果让用户可以有选择的去选取各种数据库,那无疑对用户提供了很大的方便。

自从工厂模式的设计理念出来以后,这一切实现就变得容易得多,如果大家对微软的PETSHOP有研究的话,那就不会陌生了,从PETSHOP3.0开始,微软就开始采用了多数据库操作系统的应用。数据工厂主要是通过把数据库的连接做成一个抽象的工厂,如命名DALFactory,程序中所有的数据库连接都通过这个工厂类来产生,用来负责根据配置文件动态创建系统所需的数据访问逻辑对象。

我们就拿PETSHOP来举例说明,PETSHOP在安装的时候,会提示我们选择什么数据库,如根据显示的是SQL Server数据库还是Oracle数据库,可以得到Web.config的节点中的

<add key=" WebDAL " value=" PetShop.SQLServerDAL "/>
<add key=" OrdersDAL " value=" PetShop.SQLServerDAL "/>

或者是

<add key=" WebDAL " value=" PetShop.OracleDAL "/>
<add key=" OrdersDAL " value=" PetShop. OracleDAL "/>

然后在DALFactory项目的DataAccess类中调用数据库的连接,代码如下:

private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];

然后再看下面的代码:

public static PetShop.IDAL.ICategory CreateCategory() {
      string className = path + ".Category";
      return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
    }

如我们使用的是SQL Server,那么string className = path + ".Category"返回的就是PetShop.SQLServerDAL. Category,然后再用Assembly.Load加载PetShop.SQLServerDAL.DLL,同时创建PetShop.SQLServerDAL.Category的实例,并以接口(PetShop.IDAL.ICategory)类型返回。这样业务逻辑层BLL调用ICategory接口时就会用PetShop.SQLServerDAL.Category类的实现代码。

这时候用户就不需要知道后台使用的到底是哪一种数据库,它只要调用接口就行了,在接口中定义了要使用的方法,当调用接口时会根据具体的情况再去调用底层数据访问操作。而现在这个DALFactory就是关键,当业务逻辑层要操作数据库时,DALFactory会根据具体情况再去使用生成的程序集SQLServerDAL或者OracleDAL中的一个,这样做的好处是对于业务逻辑层及WEB页面层的程序不会因为底层数据访问的程序变动而受到影响,因为只需要在业务逻辑层中调用接口就行了。

有可能有人会提,我同样在工厂类里面提供下面的方法去实现调用数据库:

public static readonly DALFactory dalFa;
string webDal = ConfigurationManager.AppSettings["WebDAL"];
switch (webDal)
{
  case "SQLServerDAL":
    dalFa = new SqlServerDALFactory();
    break;
  case "OracleDAL":
    dalFa = new OracleDALFactory();
    break;
  default:
    dalFa = new SqlServerDALFactory();
    break;
}

而这个时候如果我们增加了新的数据库访问方式,就必须得修改此部分的程序,然后再重新进行编译部署,而同样利用反射的机制去实现的时候,我们举个例子如果系统中现在需要增加MySQL数据库的时候,我们来看看它的代码的可扩展性,我们可以比较PETSHOP中的SQLServerDAL下面的Category.cs文件和OracleDAL下面的Category.cs文件的代码可知道,因为它们都继承了ICategory接口,所以类实现的方法都相同,这时候我们只需要增加一个MySqlDAL项目,其下面的Category.cs文件也同样遵循ICategory接口的方法,这时候我们再去修改为

这个时候都不需要重新对项目进行编译,只需要增加MySqlDAL.DLL文件就可,无论增加多少数据库,都是一件很简单的操作,数据工厂操作多数据的优点就明显可见。

<add key=" WebDAL " value=" PetShop.SQLServerDAL "/>为<add key=" WebDAL " value=" PetShop.MySqlDAL "/>

时间: 2024-10-26 12:32:20

在.net中利用数据工厂实现多数据库的操作的相关文章

c#-如何把datagridview中的数据保存到SQL数据库中?VB.NET或C#

问题描述 如何把datagridview中的数据保存到SQL数据库中?VB.NET或C# 如下图:已经实现从EXCEL导入数据到Datagridview中,现在要把其中的数据保存到数据库的AAAie表里面.请用代码说明,谢谢. 解决方案 取数据用ado.net保存到SQL Server数据库.http://blog.csdn.net/lysc_forever/article/details/7697536 解决方案二: 方法1.创建一个数据库,表,表名自取,表的字段和Excel相同,取Excel

asp中excel数据导入到access数据库

问题描述 asp中excel数据导入到access数据库 //上传excel文件页面 //一个页面获取到excel文件 然后提交到导入数据的asp页面进行处理,但现在提交到导入功能的页面以后报服务器错误,不知道错误出在了哪里 excel导入公益性岗位信息 excel文件: c //数据导入页面 xining为表名 通过excel中录入数据来导入到表xining中 <% session.CodePage=936 Server.ScriptTimeOut=6000000 set upload = n

mysql-请问,excel表中的数据如何倒入MySQL数据库?谢谢!

问题描述 请问,excel表中的数据如何倒入MySQL数据库?谢谢! 求详细步骤1111111111111111111111111111谢谢!谢谢! 解决方案 方法很多:1.phpmyadmin导入,格式选择csv,导入即可.注意文件格式2.使用phpexcel插件将excel数据读入成数组,然后用php插入mysql

急求:如何把datagridview 表格中的数据写入到SQL数据库表中?

问题描述 如何把datagridview表格中的数据写入到SQL数据库表中?请知道的给我点详细的代码让我学习一下,谢谢了, 解决方案 解决方案二:例:自己更换连接对象.表名就可以了.DimsqladpAsNewSqlClient.SqlDataAdapterDimsqlcomAsNewSqlClient.SqlCommandDimsqlcbdAsNewSqlClient.SqlCommandBuildersqlcom.Connection=DBsqlcom.CommandText="select

kindeditor sql-如何将kindeditor中的数据保存到SQL数据库中

问题描述 如何将kindeditor中的数据保存到SQL数据库中 主要就是我从数据库中读取了数据,然后显示在页面上.然后我在页面上通过kindeditor修改了那些数据.要怎么再保存进SQL数据库 解决方案 直接关闭即可以保存内容

数据专递-将一个数据库中的数据存入另一个数据库

问题描述 将一个数据库中的数据存入另一个数据库 将一个多字段的数据库中的数据存入到另一个少字段的数据库并且取过多字段数据库中的状态需要发生变化,

怎样把一个datagridview表中的数据存为一个数据库中的一个数据表?

问题描述 如题....在线等..... 解决方案 解决方案二:从它的数据源datatable直接循环构成insert语句即可解决方案三:SqlCommandBuilderSCB=newSqlCommandBuilder(dataAdapter1);dataAdapter1.Update(dgv1.Tables[0]);解决方案四:注意要定义变量dataAdapter1,ds1dgv要绑定ds1.Tables[0]SqlCommandBuilderSCB=newSqlCommandBuilder(

Oracle中利用数据泵导出查询结果(二) 外部表的卸载功能

还是上一篇中的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT IN

Oracle中利用数据泵导出查询结果(一) 数据泵的QUERY功能

在ITPUB上看到有人提出这个问题,能否利用数据泵导出一个查询结果.事实上数据泵还真的具有这个功能. 建立一个简单的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, N