在开发框架中扩展微软企业库,支持使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库
在前面随笔《在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动》中介绍了在代码生成工具中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,如果我们在框架应用中需要使用这个如何处理了?由于我们开发框架底层主要使用微软企业库(目前用的版本是4.1),如果是使用它官方的Oracle扩展,那么就是使用EntLibContrib.Data.OdpNet(这个企业库扩展类库使用了Oracle.DataAccess.dll),不过这种方式还是受限于32位和64位的问题;假如我们使用ODP.NET(Oracle.ManagedDataAccess.dll)方式,可以使用自己扩展企业库支持即可,类似于我们支持国产数据库--达梦数据库一样的原理,使用Oracle.ManagedDataAccess类库可以避免32位和64位冲突问题,实现统一兼容。
1、扩展支持ODP.NET(Oracle.ManagedDataAccess.dll)访问
为了实现自定义的扩展支持,我们需要对企业库的扩展类库进行处理,类似我们之前编写达梦数据库的自定义扩展类库一样,这方面可以了解下之前的随笔《基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作》,我们现在增加对ODP.NET(Oracle.ManagedDataAccess.dll)方式的扩展支持。
首先我们创建一个项目,并通过Nugget的方式获得对应的Oracle.ManagedDataAccess.dll类库,参考企业库对于Mysql的扩展或者其他的扩展,稍作调整即可。
OracleDatabase类似下面代码
- using System;
- using System.Data;
- using System.Data.Common;
- using Microsoft.Practices.EnterpriseLibrary.Common;
- using Microsoft.Practices.EnterpriseLibrary.Data;
- using Microsoft.Practices.EnterpriseLibrary.Data.Configuration;
- using Oracle.ManagedDataAccess.Client;
- namespace EntLibContrib.Data.OracleManaged
- {
- /// <summary>
- /// <para>Oracle数据库对象(使用ODP驱动)</para>
- /// </summary>
- /// <remarks>
- /// <para>
- /// Internally uses OracleProvider from Oracle to connect to the database.
- /// </para>
- /// </remarks>
- [DatabaseAssembler(typeof(OracleDatabaseAssembler))]
- public class OracleDatabase : Database
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="OracleDatabase"/> class
- /// with a connection string.
- /// </summary>
- /// <param name="connectionString">The connection string.</param>
- public OracleDatabase(string connectionString) : base(connectionString, OracleClientFactory.Instance)
- {
- }
- /// <summary>
- /// <para>
- /// Gets the parameter token used to delimit parameters for the
- /// Oracle database.</para>
- /// </summary>
- /// <value>
- /// <para>The '?' symbol.</para>
- /// </value>
- protected char ParameterToken
- {
- get
- {
- return ':';
- }
- }
- .........
主要就是把对应的类型修改为Oracle的即可,如Oracle的名称,以及参数的符号为 :等地方,其他的一一调整即可,不在赘述。
完成后,修改程序集名称,编译为 EntLibContrib.Data.OracleManaged.dll 即可。
2、框架应用的数据库配置项设置
完成上面的步骤,我们就可以在配置文件中增加配置信息如下所示,它就能正常的解析并处理了。
上面使用了两种方式,一种是官方扩展的EntLibContrib.Data.OdpNet方式,一种是我们这里刚刚出炉的 EntLibContrib.Data.OracleManaged方式,完整的数据库支持文件信息如下所示。
- <?xml version="1.0"?>
- <configuration>
- <configSections>
- <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/>
- <section name="oracleConnectionSettings" type="EntLibContrib.Data.OdpNet.Configuration.OracleConnectionSettings, EntLibContrib.Data.OdpNet" />
- </configSections>
- <connectionStrings>
- <!--SQLServer数据库的连接字符串-->
- <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI"/>
- <!--Oracle数据库的连接字符串-->
- <add name="oracle" providerName="System.Data.OracleClient" connectionString="Data Source=orcl;User ID=whc;Password=whc"/>
- <!--MySQL数据库的连接字符串-->
- <add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=WinFramework;Uid=root;Pwd=123456;"/>
- <!--PostgreSQL数据库的连接字符串-->
- <add name="npgsql" providerName="Npgsql" connectionString="Server=localhost;Port=5432;Database=postgres;User Id=postgres;Password=123456"/>
- <!--路径符号|DataDirectory|代表当前运行目录-->
- <!--SQLite数据库的连接字符串-->
- <add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WinFramework.db;Version=3;" />
- <!--Microsoft Access数据库的连接字符串-->
- <add name="access" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\WinFramework.mdb;User ID=Admin;Jet OLEDB:Database Password=;" />
- <!--IBM DB2数据库的连接字符串-->
- <add name="db2" providerName="IBM.Data.DB2" connectionString="database=whc;uid=whc;pwd=123456"/>
- <!--采用OdpNet方式的Oracle数据库的连接字符串-->
- <add name="oracle2" providerName="Oracle.DataAccess.Client" connectionString="Data Source=orcl;User id=win;Password=win;" />
- <add name="oracle3" providerName="OracleManaged" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl.mshome.net)));User ID=win;Password=win" />
- </connectionStrings>
- <dataConfiguration defaultDatabase="oracle3">
- <providerMappings>
- <add databaseType="EntLibContrib.Data.MySql.MySqlDatabase, EntLibContrib.Data.MySql" name="MySql.Data.MySqlClient" />
- <add databaseType="EntLibContrib.Data.SQLite.SQLiteDatabase, EntLibContrib.Data.SqLite" name="System.Data.SQLite" />
- <add databaseType="EntLibContrib.Data.PostgreSql.NpgsqlDatabase, EntLibContrib.Data.PostgreSql" name="Npgsql" />
- <add databaseType="EntLibContrib.Data.DB2.DB2Database, EntLibContrib.Data.DB2" name="IBM.Data.DB2" />
- <add databaseType="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet" name="Oracle.DataAccess.Client" />
- <add databaseType="EntLibContrib.Data.Dm.DmDatabase, EntLibContrib.Data.Dm" name="Dm" />
- <!--增加ODP.NET(Oracle.ManagedDataAccess.dll)方式的扩展支持-->
- <add databaseType="EntLibContrib.Data.OracleManaged.OracleDatabase, EntLibContrib.Data.OracleManaged" name="OracleManaged" />
- </providerMappings>
- </dataConfiguration>
- <appSettings>
- </appSettings>
- <startup useLegacyV2RuntimeActivationPolicy="true">
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
- <supportedRuntime version="v2.0.50727"/>
- </startup>
- </configuration>
这样我们底层就可以实现多种数据库的兼容访问了。
采用不同的数据库,我们需要为不同数据库的访问层进行生成处理,如为SQLServer数据的表生成相关的数据访问层DALSQL,里面放置各个表对象的内容,不过由于采用了相关的继承类处理和基于数据库的代码生成,需要调整的代码很少。
我们来编写一段简单的程序代码来测试支持这种ODP.net方式,测试代码如下所示。
- private void btnGetData_Click(object sender, EventArgs e)
- {
- string sql = "select * from T_Customer";// + " Where Name = :name";
- Database db = DatabaseFactory.CreateDatabase();
- DbCommand command = db.GetSqlStringCommand(sql);
- //command.Parameters.Add(new OracleParameter("name", "张三"));
- using (var ds = db.ExecuteDataSet(command))
- {
- this.dataGridView1.DataSource = ds.Tables[];
- }
- }
测试界面效果如下所示。
以上这些处理,可以适用于Web框架、Bootstrap开发框架、Winform开发框架、混合式开发框架中的应用,也就是CS、BS都可以使用。
在开发框架中扩展微软企业库,支持使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库的更多相关文章
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...
- 微软企业库支持 MySql
微软企业库支持 MySql 三步让企业库支持 mysql 数据库 1.创建 MySqlDatabaseData 类 using Microsoft.Practices.EnterpriseLibr ...
- 微软企业库的Cache
微软企业库的Cache 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.基于微软的企业库,我们的快速创建一个缓存的实现. 新建PrismSamp ...
- Prism6下的MEF:基于微软企业库的Cache
通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.基于微软的企业库,我们的快速创建一个缓存的实现. 新建PrismSample.Infrastru ...
- [EntLib]微软企业库5.0 学习之路——第一步、基本入门
话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...
- 微软企业库5.0 学习之路——第四步、使用缓存提高网站的性能(EntLib Caching)
首先先补习下企业库的Caching Application Block的相关知识: 1.四大缓存方式,在Caching Application Block中,主要提供以下四种保存缓存数据的途径,分别是 ...
- 微软企业库5.0学习-Security.Cryptography模块
一.微软企业库加密应用模块提供了两种加密: 1.Hash providers :离散加密,即数据加密后无法解密 2.Symmetric Cryptography Providers:密钥(对称)加密法 ...
- 微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇
在上一篇文章中, 我介绍了企业库Cryptographer模块的一些重要类,同时介绍了企业库Cryptographer模块为我们提供的扩展接口,今天我就要根据这些 接口来进行扩展开发,实现2个加密解密 ...
- 微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇
一.独立验证器 我上篇中我将AndCompositeValidator和OrCompositeValidator归为独立验证器,这2个验证器主要是为了第一类验证服务,可以进行多种验证组合在一起进行复杂 ...
随机推荐
- [NOIp2009] luogu P1073 最优贸易
md 我发现跟你们聊天贼没意思. 题目描述 我觉得描述挺好,不改了吧. Solution 容易发现这是道 dfs + DP 的乱搞题. 设 f[x]f[x]f[x] 表示到 xxx 这个点的最优答案. ...
- [网络流 24 题] luoguP2756 飞行员配对方案问题
[返回网络流 24 题索引] 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 222 名飞行员,其中 111 名是英国飞行员,另 ...
- qt实现串口通讯
摘要:上位机软件程序通过QT实现,采集输入信息,根据实际需要做出合适的串口通讯协议,实现效果如下图所示: 主要实现的功能: 1.串口基本参数可选,可调 2.显示区域可选择十六进制/asicii码显示, ...
- 常用函数-Linux文件操作
/************************************************************************ 函数功能:寻找文件夹下的某格式文件 std::vec ...
- gulp——用自动化构建工具增强你的工作流程
想要使用gulp,就要了解gulp,就像追自己的爱豆,你要知道爱豆的喜好.兴趣 简单的了解你的新爱豆———安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 ...
- MFC中如何分割CString类型的数据
[才疏学浅,难免有纰漏,若有不正确的地方,欢迎指教] MFC中有一个库函数 Tokenize(); 函数原型:CStringT Tokenize( PCXSTR pszTokens , int& ...
- 高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能
示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] [T ...
- Shiro learning - 认证流程(3)
Shiro认证流程 在学习认证流程之前,你应该先了解Shiro的基本使用流程 认证 身份认证: 证明用户是谁.用户需要提供相关的凭证principals(身份标识)和Credentials (凭证,证 ...
- unity基础命令
获取所挂脚本元素的组件: rd = GetComponent<Rigidbody>(); 获取其他元素的组件: rd = GameObject.Find("Player" ...
- 《Effective Java》 读书笔记(七)消除过期的对象引用
大概看了一遍这个小节,其实这种感觉体验最多的应该是C/C++程序,有多杀少个new就得有多个delete. 一直以为Java就不会存在这个问题,看来是我太年轻. 感觉<Effective Jav ...