ef连接oracle 数据库免客户端实现方法


  看了很多的文章,在没有安装oracle客户端的机器上,使用ef连接oracle数据,动辄需要300M的dll。好吧,我承认那样是可以的。

但是如果我开发的仅仅是一个winform程序,代码仅仅是几十M,这样的程序即使开发的再好,我想也不会有人去使用。

  自从vs对oracle的oracleclient过时后, oracle提供给vs的开发支持工具已经为我们提供了最简单的dll,Oracle.ManagedDataAccess.dll。安装odp.net后,在开发中,只需将这个dll引用即可,并允许其复制到本地,或者发布程序后,将其拷贝到本地。
 程序发布后,拷贝到没有安装oracle客户端的电脑上运行。出现异常:没有提供驱动程序。

原因就是在framework的机器文件machine.config中,没有提供驱动程序,可在其中添加如下配置

 <system.data>
    <DbProviderFactories>
<remove invariant="ODP.NET, Managed Driver"/>
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data>

 

 (注:下边的内容其实可以不用的,只是本人用来练手的!)

但是这样很不友好。因此我们可以把以上代码写入程序的配置文件中。

注意,程序的配置文件和机器配置是互斥的,也就是这段代码只能在其中一个文件中存在,不能同时存在,也不能都存在。

因此自己写了一段代码,动态的处理配置

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Configuration;
using System.Windows.Forms;

namespace Utility
{
    public class OracleDriverWithoutClient
    {
        private static OracleDriverWithoutClient _instance = null;

        /// <summary>
        /// 初始化oracle在配置文件中驱动
        /// </summary>
        private OracleDriverWithoutClient()
        {
            if (!CheckFramework4MachineConfig() && !CheckAppconfig())
            {
                //在机器配置和程序运行配置文件都没有oracle托管驱动,那么添加
                AddOracleManagedDriver();
            }
            else if (CheckFramework4MachineConfig() && CheckAppconfig())
            {
                //在机器配置中存在,在程序运行配置文件同时存在,那么从程序运行配置中删除
                RemoveOracleManagedDriver();
            }
        }
        public static OracleDriverWithoutClient CreateInstance()
        {
            if (_instance == null)
            {
                _instance = new OracleDriverWithoutClient();
            }
            return _instance;
        }

        /// <summary>
        /// 检测机器配置未见是否已经安装了oralce托管驱动
        /// </summary>
        /// <returns></returns>

        bool CheckFramework4MachineConfig()
        {
            var machinePath = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config";
            var ele = XElement.Load(machinePath);
            var addNodes = ele.Element("system.data").Element("DbProviderFactories").Elements("add").ToList();

            if (addNodes.Any(o => o.Attribute("name").Value == "ODP.NET, Managed Driver"))
            {
                return true;
            }
            return false;
        }

        /// <summary>
        /// 检测程序配置文件中是否已经存在了oracle托管驱动
        /// </summary>
        /// <returns></returns>
        bool CheckAppconfig()
        {
            var configPath = AppDomain.CurrentDomain.BaseDirectory + string.Format(@"\{0}.exe.config", Application.ProductName);
            var appConfigElement = XElement.Load(configPath);

            var systemDataEle = appConfigElement.Element("system.data");

            if (systemDataEle == null) return false;
            var dbProviderFactoriesEle = systemDataEle.Element("DbProviderFactories");
            if (dbProviderFactoriesEle == null) return false;
            if (!dbProviderFactoriesEle.Elements("add").Where(o => o.Attribute("name").Value == "ODP.NET, Managed Driver").Any())
                return false;
            return true;

        }

        /// <summary>
        /// 向程序驱动中添加oracle托管驱动配置
        /// </summary>
        void AddOracleManagedDriver()
        {
            var configPath = AppDomain.CurrentDomain.BaseDirectory + string.Format(@"\{0}.exe.config", Application.ProductName);
            var appConfigElement = XElement.Load(configPath);

            var systemDataEle = appConfigElement.Element("system.data");

            if (systemDataEle == null)
            {
                appConfigElement.Add(new XElement("system.data"));
                systemDataEle = appConfigElement.Element("system.data");
            }
            var dbProviderFactoriesEle = systemDataEle.Element("DbProviderFactories");
            if (dbProviderFactoriesEle == null)
            {
                systemDataEle.AddFirst(new XElement("DbProviderFactories"));
                dbProviderFactoriesEle = systemDataEle.Element("DbProviderFactories");
            }
            if (!dbProviderFactoriesEle.Elements("add").Where(o => o.Attribute("name").Value == "ODP.NET, Managed Driver").Any())
            {
                dbProviderFactoriesEle.AddFirst(new XElement("add", new object[] { 
                    new XAttribute("name", "ODP.NET, Managed Driver")
                    , new XAttribute("invariant", "Oracle.ManagedDataAccess.Client")
                    ,new XAttribute("description","Oracle Data Provider for .NET, Managed Driver"),
                new XAttribute("type","Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342")}));
            }
            appConfigElement.Save(configPath, SaveOptions.None);
        }

        /// <summary>
        /// 从程序配置文件中删除oracle托管驱动配置
        /// </summary>
        void RemoveOracleManagedDriver()
        {
            var configPath = AppDomain.CurrentDomain.BaseDirectory + string.Format(@"\{0}.exe.config", Application.ProductName);
            var appConfigElement = XElement.Load(configPath);

            var systemDataEle = appConfigElement.Element("system.data");

            if (systemDataEle == null) return;
            var dbProviderFactoriesEle = systemDataEle.Element("DbProviderFactories");
            if (dbProviderFactoriesEle == null) return;

            if (dbProviderFactoriesEle.Elements("add").Where(o => o.Attribute("name").Value == "ODP.NET, Managed Driver").Any())
            {
                dbProviderFactoriesEle.Elements("add").Where(o => o.Attribute("name").Value == "ODP.NET, Managed Driver").Remove();
            }
            appConfigElement.Save(configPath, SaveOptions.None);
        }
    }

}

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM