简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型
如何在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数据提供程序工厂模型的更多相关文章
- Delphi中的接口和抽象类
参考:http://blog.csdn.net/xinzheng_wang/article/details/6058643 接口:Interface Delphi中接口中的关键字Interface,但 ...
- C#中的接口实现多态
我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态 1.首先我们先要来了解了解什么是接口,它存在的意识 01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 02 ...
- c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)
总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖 ...
- ADO中最重要的对象有三个:Connection、Recordset和Command
ConnectionPtr: _ConnectionPtr m_pConnection; HRESULT hr; try{ hr = m_pConnection.CreateInstance(_uui ...
- 类与接口(三)java中的接口与嵌套接口
一.接口 1. 接口简介 接口: 是java的一种抽象类型,是抽象方法的集合.接口比抽象类更加抽象的抽象类型. 接口语法: [修饰符] [abstract] interface 接口名 [extend ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- 面向对象在JavaScript中的接口实现
接口是面向对象编程的基础.它是一组包括了函数型方法的数据结构,与类一样.都是编程语言中比較抽象的概念.比方生活中的接口.机顶盒.人们利用它来实现收看不同频道和信号的节目,它宛如对不同类型的信息进行集合 ...
- C#中的接口和抽象类学习
今天学习了接口和抽象类,但并没有很好的进行整理,所以现在写的时候,脑子里多少有点乱乱的,先从接口开始吧. interface 接口,规定了所有派生类的需要遵循的标准,接口定义了需要做些什么,但是没有具 ...
- 1-JAVA类、接口、抽象、多态
类中全部成员变量用priviate修饰,用get获取,set设值 对于boolean类型的值,getter方法也一定要写成isXXX 的形式,而setXXX类型不变 this关键字的作用 当方法的局部 ...
随机推荐
- ReentrantLock和读写锁
在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock. ReentrantLock概况 ReentrantLock是 ...
- Maven的安装步骤
1.确保jdk安装成功,注意在系统环境下,必须添加jdk的路径.2.将maven的路径配置在系统环境变量中.3.修改maven的默认路径,即:将config下的settings.xml文件中的目录节点 ...
- .NET Core 迁移躺坑记
最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core. 整体过程,从业务层面说一般般吧(整体还好但还是搞的业务有感,没出严重故障)但是技术层面上感觉其实并没有达到要 ...
- 聚焦“云开发圆桌论坛”,大前端Serverless大佬们释放了这些讯号!
4月14日,由云加社区举办的TVP&腾讯云技术交流日云开发专场,暨"腾讯云-云开发圆桌论坛"在北京.深圳两地同步举行. 当天下午,一场主题为"基于大前端和node ...
- MongoDB面试题
1.什么是MongoDB MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库.采用BSON存储文档数据.BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSO ...
- JS 图片放大镜
今天练习一个小demo, 从本地读取图片, 然后实现类似淘宝放大镜的效果, 再加两个需求 1 .可以调节缩放比例,默认放大两倍 2 . 图片宽高自适应, 不固定宽高 话不多说先看效果: 原理:1, 右 ...
- Thymeleaf【快速入门】
前言:突然发现自己给自己埋了一个大坑,毕设好难..每一个小点拎出来都能当一个小题目(手动摆手..),没办法自己选的含着泪也要把坑填完..先一点一点把需要补充的知识学完吧.. Thymeleaf介绍 稍 ...
- jQuery拼图小游戏
jQuery拼图小游戏 最后样式 核心代码部分 <script type="text/javascript" > $(function () { $("td& ...
- Intellij idea 离线安装activiti工作流插件
想在Intellij idea上安装一个activiti插件玩玩,由于网络环境原因,不能使用网上已有的在线搜索acti bpm并安装的方式.也在网上找了好久没找到离线安装的方式.自己摸索了一下装好了, ...
- gitbook 入门教程之使用 gitbook-editor 编辑器开发电子书
亲测,目前已不再支持旧版 gitbook-editor 编辑器,而官网也没有相应的新版编辑器,如果哪位找到了新版编辑器,还望告知! 现在注册 gitbook 账号会默认重定向到 新版官网,而 旧版官网 ...