一、问题描述
在开发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和数据库实例需要在这个特定文件中配置,与所开发的客户端程序分离,对于项目的部署来说多出了两步:1)Oracle客户端的安装(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="
DATA SOURCE=HJSYSDB;
PERSIST SECURITY INFO=True;USER ID=DATA""
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="
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""
providerName="System.Data.EntityClient" />
</connectionStrings>
三、问题总结
1、使用ODP.net提供的Oracle.DataAccess.dll时,需要注意连接服务器的Oracle版本及程序所部署系统的版本问题。
2、Web程序的相关配置与此方法大致相同。

本文介绍了一种在C#.Net环境下不安装Oracle客户端即可部署应用的方法,通过使用ODP.net提供的动态库并调整数据库连接配置实现简化部署流程。

251

被折叠的 条评论
为什么被折叠?



