如何在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. esxi存储(外部共享存储)

    vSphere 基础物理架构中存储是一个非常关键的部分,没有好的存储,虚拟化也就没有存在的价值,并且它能够决定其系统性能的高低和如vMotion等高级功能能否实现.所以本次重点介绍vSphere中的存 ...

  2. 大白话5分钟带你走进人工智能-第三节最大似然推导mse损失函数(深度解析最小二乘来源)(1)

                                                    第三节最大似然推导mse损失函数(深度解析最小二乘来源)        在第二节中,我们介绍了高斯分布的 ...

  3. 详解线程池execute和submit用法

    在使用线程池时,我们都知道线程池有两种提交任务的方式,那么他们有什么区别呢? 1.execute提交的是Runnable类型的任务,而submit提交的是Callable或者Runnable类型的任务 ...

  4. 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API

    前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ...

  5. 经典卷积神经网络结构——LeNet-5、AlexNet、VGG-16

    经典卷积神经网络的结构一般满足如下表达式: 输出层 -> (卷积层+ -> 池化层?)+  -> 全连接层+ 上述公式中,“+”表示一个或者多个,“?”表示一个或者零个,如“卷积层+ ...

  6. Linux也有后悔药,五种方案快速恢复你的系统

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个 ...

  7. kubernetes实践之三:深入理解Pod对象

    一.Pod定义 最小部署单元 一组容器集合 一个pod中的容器共享网络命名空间 Pod是短暂的 二.Pod容器分类 基础容器 维护整个Pod的网络命名空间 初始化容器 先于业务容器开始执行,在应用启动 ...

  8. 设计模式之行为类模式PK

    行为类模式包括: 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注 ...

  9. 全球排名第一的免费开源ERP Odoo 12产品发布会北京站开始报名

    Odoo V12 产品(北京)发布会 暨企业数字化转型论坛 快速报名通道:http://odoochina.mikecrm.com/uG8nNu4 随着新版本Odoo 12的发布,开源智造(OSCG. ...

  10. 6.使用桌面版AI伴侣或手机版AI伴侣实时预览编程效果

    1.根据自己系统下载对应版本AI伴侣,最好解压到D盘根目录. 运行ailaunch.bat ,可以启动原本自带的2.46版AI伴侣.运行AI伴侣247.bat可以启动汉化2.47版的AI伴侣.并且默认 ...