在未安装Oracle数据库客户端的前提下,C#通过使用ADO的方式远程访问服务器,会出现:“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”问题,本文提供一种方式解决该问题。 具体步骤步骤如下: 第一步:下载Instant Client 文件 Oracle官方网站提供了Instant Client文件的下载,下载地址为:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html,里面提供了支持不同操作系统和不同Oracle版本的对应下载,根据不同需求自己选择。
我的系统环境如下: 数据库服务器:WindowsServer2008x64 数据库服务端:oracle11.2.0.1.0 客户端系统:Windows7x64 因此我选择下载了instantclient-basic-win-x86-64-11.2.0.1.0.zip 只需在客户端将其解压即可(位置任意),我解压在d盘根目录,生成一个文件夹d:\instantclient_11_2(然后将其修改成oracleclient,根据自己需要修改),里面就是连接远程数据库要用到的dll文件。 第二步:配置环境变量
1、 在PATH变量中增加【;D:\oracleclient】,即就是刚才我们解压Instant Client所在的目录; 2、增加以下三个变量: NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK TNS_ADMIN= D:\oracleclient LD_LIBRARY_PATH= D:\oracleclient 第三步:配置tnsnames.ora文件 在 D:\oracleclient目录中增加一个tnsnames.ora文件,内容为访问数据库的配置信息。具体步骤为:新建一个txt文档,然后将一下内容复制进去,另存为tnsnames.ora即可。 ORCL= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.107) (PORT = 1521) ) ) (CONNECT_DATA = (SERVICE_NAME = lottery) ) ) 其中的HOST、PORT、SERVICE_NAME需要根据数据库实际信息进行修改。 此时在C#代码中的连接字符串可以按如下方式定义: String conn =@'DataSource=ORCL;Persist Security Info=True;User Id=用户名;Password=密码';
否则,如果想省略第三步,在C#代码中的连接字符串必须按如下方式定义:
String conn =String.Format('Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS= (PROTOCOL = TCP)(HOST = 192.168.1.107)(PORT = 1521))) (CONNECT_DATA=(SERVICE_NAME = lottery) ) );User Id=用户名;Password=密码;'); 第四步:重启系统 C#代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OracleClient; namespace TestOracle { class Program { static void Main(string[] args) { String conn = @'Data Source=ORCL;Persist Security Info=True;User Id=testdb;Password=manager'; String conn1 = String.Format('Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.107)(PORT = 1521))) (CONNECT_DATA =(SERVICE_NAME = lottery) ) );User Id=testdb;Password=manager;'); OracleConnection oc = new OracleConnection(conn); try { oc.Open(); OracleCommand cmd = oc.CreateCommand(); cmd.CommandText = 'select sysdate from dual'; OracleDataReader odr = cmd.ExecuteReader(); while (odr.Read()) { Console.WriteLine(odr.GetDateTime(0).ToString()); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { oc.Close(); } Console.Read(); } } }
运行结果: 
|