在開發框架中擴展微軟企業庫,支持使用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位衝突問題,實現統一兼容。html

一、擴展支持ODP.NET(Oracle.ManagedDataAccess.dll)訪問

爲了實現自定義的擴展支持,咱們須要對企業庫的擴展類庫進行處理,相似咱們以前編寫達夢數據庫的自定義擴展類庫同樣,這方面能夠了解下以前的隨筆《基於Enterprise Library的Winform開發框架實現支持國產達夢數據庫的擴展操做》,咱們如今增長對ODP.NET(Oracle.ManagedDataAccess.dll)方式的擴展支持。mysql

首先咱們建立一個項目,並經過Nugget的方式得到對應的Oracle.ManagedDataAccess.dll類庫,參考企業庫對於Mysql的擴展或者其餘的擴展,稍做調整便可。sql

 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的名稱,以及參數的符號爲 :等地方,其餘的一一調整便可,不在贅述。oracle

完成後,修改程序集名稱,編譯爲 EntLibContrib.Data.OracleManaged.dll 便可。app

 

二、框架應用的數據庫配置項設置

完成上面的步驟,咱們就能夠在配置文件中增長配置信息以下所示,它就能正常的解析並處理了。框架

 

 上面使用了兩種方式,一種是官方擴展的EntLibContrib.Data.OdpNet方式,一種是咱們這裏剛剛出爐的 EntLibContrib.Data.OracleManaged方式,完整的數據庫支持文件信息以下所示。ide

<?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,裏面放置各個表對象的內容,不過因爲採用了相關的繼承類處理和基於數據庫的代碼生成,須要調整的代碼不多。sqlserver

咱們來編寫一段簡單的程序代碼來測試支持這種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[0];   
    }
}

測試界面效果以下所示。

以上這些處理,能夠適用於Web框架、Bootstrap開發框架、Winform開發框架、混合式開發框架中的應用,也就是CS、BS均可以使用。

相關文章
相關標籤/搜索