在C#中,远程连接Oracle数据库(不安装客户端,无需多余配置)

时间:2021-11-20 00:28:46

由于项目需要,现需要向远程oracle数据库插入数据。由于后期可能无法在部署程序的电脑上安装oracle客户端,网上也有一些解决办法,通常是要下载对应版本的Oracle Instant Client,将访问Oracle需要的部分Dll文件拷贝到客户端本地,然后通过配置环境变量或修改注册表的方式,来达到快速安装客户端的目的,如果后期部署程序在虚拟空间时,配置环境变量或修改注册表或许不可行。这里提供一种简单、无需安装和多余配置的方法,适用于.NET C#。

本方法通过程序内集成Oracle客户端,下面是这种方法的具体实现:

1.从Oracle官网上下载对应版本的Oracle Instant Client,以下是官网链接
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

但是由于我下载其中的Win32版本的文件不全,因此又通过查找另外下载了一些文件,现已把我在32位机器上测试远程连接Oracle 10g数据库通过的完整文件上传到csdn,链接为http://download.csdn.net/detail/xiaohu_2012/5999699,压缩包包括如下文件:

classes12.jar oci.dll
ocijdbc10.dll
ociw32.dll
ojdbc14.jar
Oracle.DataAccess.dll
orannzsbb10.dll
oraocci10.dll
oraociei10.dll
OraOps11w.dll

其中OraOps11w.dll与Oracle.DataAccess.dll需要配套。

2.在你的工程目录里新建一个文件夹Oracle(名字和位置随便定),将上述文件拷贝到里边,并在Visual Studio中添加这个文件夹及文件们。保证可以在解决方案中看到它们。

3.在Visual Studio IDE 的解决方案资源管理器中,打开Oracle文件夹,选中里边所有的文件,在“属性”“复制到输出目录”里设置“如果较新则复制”,这样在编译或者发布程序时,Oracle文件夹会随着发布到exe所在的地方,部署的时候就不会出现找不到Oracle库的情况。

4.按照网上的大多数教程,这个时候就需要配置Windows环境变量了。其实这一步并不是必须的,因为考虑到不同的客户环境,有可能用户没有权限在他的计算机上操作这些,那么我们可以把设置Oracle环境变量放到程序里来做。这就需要在使用Oracle连接之前,添加如下代码:

//取得oracle驱动文件夹的位置,也就是放oci.dll的地方
string oraclePath = System.Windows.Forms.Application.StartupPath + @"\oracle";
//设置环境变量“PATH”,写入oracle驱动所在的文件夹
//第三个参数表示这个PATH只在当前进程起作用,不会修改电脑本身。
Environment.SetEnvironmentVariable("PATH",
oraclePath,EnvironmentVariableTarget.Process);
//设置Oracle在通讯过程中使用的语言和字符集。
//我的项目用的是上面的字符集,对应到你的项目,可用SQL语句去oracle数据库中查询。
//这个语言和字符集一定要和服务器一致,否则可能会出现乱码甚至无法连接。
Environment.SetEnvironmentVariable("NLS_LANG", "SIMPLIFIED CHINESE_CHINA.ZHS16GBK", EnvironmentVariableTarget.Process);

补充说明,可以用以下SQL语句查询字符集:

select userenv('language') from dual;查询服务端字符集,用来设置上面的参数。
select * from nls_database_parameters;//服务器字符集
select * from nls_instance_parameters;//ora文件定义字符集
select * from nls_session_parameters;//会话字符集

5.理论上,经过上面的设置,你的程序就可以使用内置到exe目录下的Oracle驱动了,这里要注意的还有就是连接数据库的方式,上面的修改并不能保证你可以使用tns名来连接,因此连接字符串要做如下修改:

"Persist Security Info=True;User ID=数据库用户名;Password=密码;Unicode=True;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=服务器IP地址)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=服务器上全局数据库的服务名)))"
这个主要是把"Data Source"这部分直接用TCP/IP字符串方式替换了(通常Data Source是写tns名称的)

6.Ok,运行程序,连接成功!