简述在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关键字的作用 当方法的局部 ...
随机推荐
- visual studio2015中开发python
之前下载了visual studio2017但是发现很不好用,不如使用matlab与visual studio混合编程就根本找不到visual studio,只有下了visual studio2015 ...
- 咸鱼Chen
关于我 网名:咸鱼Chen 英文:nick chen 签名:I'm nothing but I must be everything. 标签:Python爱好(ma)者(nong),干过后端开发.算法 ...
- API 测试的具体实现
目录 API 测试的具体实现 基于 Spring Boot 构建的 API 使用 cURL 命令行工具进行测试 使用图形界面工具 Postman 进行测试 如何应对复杂场景的 API 测试? 总结 A ...
- Linux文件属性及权限
一.Linux文件属性: 例如: drwxr-xr-x 2 hdy hdy 4096 11月 28 00:18 桌面 drwxr-xr-x 2 hdy hdy 4096 11月 28 00:18 桌面 ...
- 【坑】解决CentOS 7.1版本以上安装好zabbix 3.4 无法重启zabbix-server的问题
1. 问题所在 报错信息:zabbix_server[]: segfault at ip 00007f78842b4bd0 sp 00007fff1995a818 error ] 2. 产生原因 Ce ...
- C# ASP.NET MVC:使用Cookie记住账号密码
MVC记住账号密码 使用cookie操作 前端: <div> 用户名:<input type="text" id="UserName" val ...
- linux高级编程
系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...
- 设计模式 | 外观模式/门面模式(facade)
定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构:(书中图,侵删) 一个简洁易用的外观类 一个复杂的子系统 实例: 书中提到了理 ...
- css实现3D切换功能
Demo asdasdasd <!DOCTYPE html> <html lang="en"> <head> <title>De ...
- [Android 除錯] Conflict with dependency
Android Studio build 時的錯誤訊息 : Conflict with dependency 詳細錯誤訊息 : Conflict with dependency 'com.androi ...