欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

免Oracle客户端安装的开发部署方法

程序员文章站 2022-07-15 20:18:43
...

一、问题描述

在开发C#.Net客户端程序时,使用了ODAC连接数据库,其开发环境需要安装ODP.NET插件,实际上是安装了一个Oracle Client。其连接Oracle的字符串直接配置到了这个Oracle Client下的配置文件中(%ORA_HOME%\client_1\NetWork\tnsnames.ora)中,信息如下:

 

HJSYSDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.52)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )

 

 

由于连接字符串的IP和数据库实例需要在这个特定文件中配置,与所开发的客户端程序分离,对于项目的部署来说多出了两步:1Oracle客户端的安装(480M多);2)数据库连接的手动配置。

 

为减少多余的安装过程以及便于将数据库连接的配置放置到项目程序中,使程序部署更简单化,需要一种免Oracle客户端的安装部署方法。

 

二、问题解决

直接使用ODP.net提供的动态库(最小支持),放置到项目启动目录下,如下文件:

 

oci.dll
ociw32.dll
Oracle.DataAccess.dll
oraocci11.dll
oraociei11.dll
OraOps11w.dll

 

 

在项目的app.config中增加以下配置,为应用程序提供数据库连接驱动:

 


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

 

 

由于没有使用Oracle客户端的连接实例,在程序中的连接需要做特别指定数据库连接的IP和数据库实例信息,如下所示:

            string connectionString = 
                  " DATA SOURCE=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)"
                + "(HOST=192.168.18.52)(PORT=1521))"
                + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));"
                + "USER ID=data;PASSWORD=data;";

            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                string sql = "**********";
                connection.Open();
                OracleCommand cmd = new OracleCommand(sql, connection);
                OracleDataAdapter dataReader = new OracleDataAdapter(cmd);
                DataSet dataSet = new DataSet();
                dataReader.Fill(dataSet);
                gridControl1.DataSource = dataSet.Tables[0];
            }

 

如果使用实体集,之前直接使用Oracle客户端提供的连接字符串,App.config中的配置是这样的(留意HJSYSDB):

  <connectionStrings>
    <add name="DataEntities"
         connectionString="metadata=res://*/Models.DataModel.csdl|res://*/Models.DataModel.ssdl|res://*/Models.DataModel.msl;
         provider=Oracle.DataAccess.Client;
         provider connection string=&quot;
         DATA SOURCE=HJSYSDB;
         PERSIST SECURITY INFO=True;USER ID=DATA&quot;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>

 

使用免安装的方法后,实体集的连接字符串也需要做相应的修改,其中改变的主要内容是DATA SOURCE的配置,其中包括了数据库服务器的IP地址以及数据库实例。

  <connectionStrings>
    <add name="DataEntities"
         connectionString="metadata=res://*/Models.DataModel.csdl|res://*/Models.DataModel.ssdl|res://*/Models.DataModel.msl;
         provider=Oracle.DataAccess.Client;
         provider connection string=&quot;
         DATA SOURCE=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.18.52)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));
         PERSIST SECURITY INFO=True;USER ID=DATA&quot;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>

 

 

三、问题总结

1、使用ODP.net提供的Oracle.DataAccess.dll时,需要注意连接服务器的Oracle版本及程序所部署系统的版本问题。

 

2、Web程序的相关配置与此方法大致相同。