如何在ADO中使用接口的抽象数据提供程序

在cofig中 appSettings下,配置数据连接类型

 <appSettings>
<!--这个键值映射到枚举值中的某个值-->
<add key="provider" value="SqlServer"/>
<add key="ConnectionString" value="server=服务器名;User ID=用户名;Password=密码;database=数据库名;Max Pool Size=3000;Connect TimeOut=60;Pooling=true"/>
</appSettings>

使用接口的抽象数据提供程序

            Console.WriteLine("******Simple Connecion Factory*****");
IDbConnection mycon = GetConnection(DataProvider.SqlServer);
Console.WriteLine(mycon.GetType()); //通过配置文件
string dataProvString = ConfigurationSettings.AppSettings["provider"];
DataProvider dp = DataProvider.None;
if (Enum.IsDefined(typeof(DataProvider), dataProvString))
{
dp = (DataProvider)Enum.Parse(typeof(DataProvider), dataProvString);
}
else
{
Console.WriteLine("Soryy");
}
IDbConnection myCn = GetConnection(dp);
if (myCn != null)
{
Console.WriteLine(myCn.GetType().Name);
} enum DataProvider
{
SqlServer,
OleDb,
Odbc,
None
} static IDbConnection GetConnection(DataProvider dp)
{
IDbConnection con = null;
switch (dp)
{
case DataProvider.SqlServer:
con = new SqlConnection();
break;
case DataProvider.OleDb:
con = new OleDbConnection();
break;
case DataProvider.Odbc:
con = new OdbcConnection();
break;
case DataProvider.None:
break;
default:
break;
}
return con; ;
}

ADO.NET数据提供程序工厂模型

.NET数据提供程序工厂模式能让我们用多种数据访问类型构建单个代码库。而且通过应用程序配置文件(和全新的<connectionstrings>片段),我们无需重新编译、重新部署程序集就能够更改和获取提供程序和连接字符串。
* 数据提供程序中的类都从相同基类继承并且都被定义在System.Data.Command命名空间内。
*DbCommand:所有命令类的抽象基类
*DbConnction:所有连接类的抽象基类
*DbDataAdapter:所有数据适配器类的抽象基类。
*DbDataReader:所有数据读取器类的抽象基类。
*DbParameter:所有参数类的抽象基类
*DbTransaction :所有事务类的抽象基类
另外,每个微软提供的数据提供程序都有一个继承自System.Data.DbProviderFaCtory 的类。这个基类定义了一些方法来获取某数据提供程序的数据对象

完整的数据提供程序工厂的例子

  string dp = ConfigurationSettings.AppSettings["provider"];
string constr = ConfigurationSettings.AppSettings["ConnectionString"]; DbProviderFactory df = DbProviderFactories.GetFactory(dp);
using (DbConnection cn = df.CreateConnection())
{
Console.WriteLine(cn.GetType().Name);
cn.ConnectionString = constr;
cn.Open(); DbCommand cmd = df.CreateCommand();
Console.WriteLine(cmd.GetType().Name);
cmd.Connection = cn;
cmd.CommandText = "select * from TCustomer";
using (DbDataReader dr = cmd.ExecuteReader())
{
Console.WriteLine(dr.GetType().Name);
while (dr.Read())
{
Console.WriteLine(dr["CreateTime"].ToString());
}
}
}

数据提供程序工厂模型的潜在缺陷

尽管这个模型很强.但是你要知道,代码库其实只能通过抽象基类的成员来使用所有提供程序通用的一些类型和方法。因此在写代码库的时候.你会被局限于system.Data.Common命名空间下的
DbConnection 、 DbCommand 等其他类型公开的成员。

这样,你会发现这种“泛化的”方式使得我们不能直接访问特定DBMS的漂亮功能。如果我们必须调用基础提供程序(比如SqlConnection)的特殊成员,那么可以通过显式强制类型转换就能实现

然而,这样会使代码变得不易维护(也缺乏灵活性).因为我们必须增加许多运行时检测。但如果你希望以最灵活的方式构建数据访问阵,数据提供程序工厂模划提供了一个很好的机制

[connectionstrings]元素

我们的连接字符串数据现在在*.config文件的<appSettings>元素中,应用程序配置文件定义了一个新的元素,叫做<connectionstrings>;你能在这个元素内设置任意多的名称/值组合并且能通过
configurationManager.Connectionstrings 索引器以编程方式访问。这种方式的(相比使用<appsettings>元素和configurationManager.Appsettings 索引器来访问)好处在于它能为你的应用程序以一个统一的方式定义多个连接字符串

具体配置如下

<connectionStrings>
<add name="ECPublic" connectionString="server=服务器名;User ID=用户名;Password=密码;database=数据库名;Min Pool Size=100;Max Pool Size=200;"/>
<add name="CRM" connectionString="server=服务器名;User ID=用户名;Password=密码;database=数据库名;Min Pool Size=100;Max Pool Size=200;"/>
</connectionStrings>

简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型的更多相关文章

  1. Delphi中的接口和抽象类

    参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...

  2. C#中的接口实现多态

    我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态 1.首先我们先要来了解了解什么是接口,它存在的意识 01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 02 ...

  3. c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)

    总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖 ...

  4. ADO中最重要的对象有三个:Connection、Recordset和Command

    ConnectionPtr: _ConnectionPtr m_pConnection; HRESULT hr; try{ hr = m_pConnection.CreateInstance(_uui ...

  5. 类与接口(三)java中的接口与嵌套接口

    一.接口 1. 接口简介 接口: 是java的一种抽象类型,是抽象方法的集合.接口比抽象类更加抽象的抽象类型. 接口语法: [修饰符] [abstract] interface 接口名 [extend ...

  6. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  7. 面向对象在JavaScript中的接口实现

    接口是面向对象编程的基础.它是一组包括了函数型方法的数据结构,与类一样.都是编程语言中比較抽象的概念.比方生活中的接口.机顶盒.人们利用它来实现收看不同频道和信号的节目,它宛如对不同类型的信息进行集合 ...

  8. C#中的接口和抽象类学习

    今天学习了接口和抽象类,但并没有很好的进行整理,所以现在写的时候,脑子里多少有点乱乱的,先从接口开始吧. interface 接口,规定了所有派生类的需要遵循的标准,接口定义了需要做些什么,但是没有具 ...

  9. 1-JAVA类、接口、抽象、多态

    类中全部成员变量用priviate修饰,用get获取,set设值 对于boolean类型的值,getter方法也一定要写成isXXX 的形式,而setXXX类型不变 this关键字的作用 当方法的局部 ...

随机推荐

  1. Python中collections模块

    目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque ChainMap Python中collections ...

  2. MIP 组件库升级公告

    背景 为了方便广大开发者们更好地使用组件,现对 MIP 组件库统一进行升级,升级后将分为通用组件和自定义组件两类,方便开发. 通用组件,即考虑了组件通用性方便所有开发者参考使用的组件,将存放于 mip ...

  3. javascript正则表达式学习(二)--位置匹配

    文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...

  4. 深入理解es6-Promise对象

    前言     在之前翻博客时,看到promise,又重读了一边,突然发现理解很浅,记的笔记也不是很好理解,又重新学习promise,加深理解,学以致用     在promise出来之前,js常用解决异 ...

  5. WebSocket协议详解与c++&c#实现

    摘要: 随着手机游戏.H5游戏以及微信小游戏的普及,越来越多的客户端-服务器端的通讯采用websocket协议.Websocket协议是全双工的.基于数据帧的.建立在tcp之上的长连接协议.Webso ...

  6. OSPF 基础实验

    一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1.掌握多区域的 OSPF 配置方法. 2.区别不同区域的路由. 3.掌握 OSPF 的路由汇总配置. 4.掌握  ...

  7. netcore服务程序暴力退出导致的业务数据不一致的一种解决方案(优雅退出)

    一: 问题提出 现如今大家写的netcore程序大多部署在linux平台上,而且服务程序里面可能会做各种复杂的操作,涉及到多数据源(mysql,redis,kafka).成功部署成后台 进程之后,你以 ...

  8. Hystix熔断解决雪崩问题

    1.线程隔离,服务降级(服务的消费方做降级处理) 当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果. 这就好比去买鱼,平常超市买鱼会 ...

  9. 2.JAVA-基础语法以及String的介绍

    1.goto和const 目前java中,和C/C++有点区别,就是暂未用到goto const关键字.示例如下: public class Hello{ public static void mai ...

  10. vue 中使用promise

    init1(){return new Promise((resolve, reject) => { let data={ dateStr:this.time }; api.get('url', ...