使用odp.net连接到Oracle,使用C#连接OCI

我一直在阅读如何从我的C#win应用程序连接到我的oracle数据库,但我一直在“撞墙”。 我决定使用odp.net和OCI,这样客户端计算机不需要安装客户端,但我无法让它工作。

我有一个小的测试应用程序,我在下面显示的代码,在我的解决方案中,我从oracle OCI添加了以下dll:oci.dll,orannzsbb11.dll和oraociicus11.dll。 它们都与最终的.exe文件放在一起。

测试代码:

private static string CONNECTION_STRING = "User Id=hr;Password=hr;Data Source=(DESCRIPTION=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))" + "(CONNECT_DATA=(SID=XE)));Connect Timeout=15;"; static void Main(string[] args) { try { using (var conn = new OracleConnection(CONNECTION_STRING)) { conn.Open(); Console.WriteLine("Connection is: {0}", conn.State.ToString()); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } 

问题发生在using(…)语句中,程序停止工作,我没有得到任何响应。 为了让OCI工作,我需要做些什么?

为了能够在不安装完整客户端的情况下使用ODP.NET,您需要使用Oracle Instant Client软件包(您不能只从完整的客户端复制库):

  • 点击此处查看要求说明。
  • 从Oracle v10开始,我强烈建议使用EZCONNECT来简化连接字符串。 这个怎么样:

     private const string CONNECTION_STRING="User Id=hr;Password=hr;"+ +"Data Source=127.0.0.1:1521/XE;Connect Timeout=15;"; 

通常,在使用OCI或Oracle数据库产品时,应定义ORACLE_HOME环境变量并指向oracle安装。 在库的旁边,Oracle确实使用了一些其他支持文件,并在ORACLE_HOME中搜索它们。 通常,LD_LIBRARY_PATH定义为ORACLE_HOME / lib。 尝试使用Instant Client ,这很可能比手工挑选一些库更好。 有关如何使其工作的好文章在这里: 在win32上安装Oracle instantclient basic和instantclient sqlplus你可以省略关于sqlplus的部分。

从otn上的实例客户端页面:

即时客户端下载请注意,Instant Client是根据Instant Client的单独OTN开发和分发许可提供的,允许大多数被许可方在生产环境中免费下载,重新分发和部署。 如有必要,请咨询许可证和您的法律部门以获得澄清。 有关Instant Client的详细信息,请参阅官方Instant Client站点。

看起来您可以重新分发实例客户端。

阅读Oracle for ODAC中的安装说明。 这也讨论了常见的设置问题。

您还需要在解决方案中包含对Oracle.DataAccess的引用,并“使用Oracle.DataAccess.Client;” 对于您的连接,您可能希望使用可以通过tnsnames文件解析的Oracle SID(尝试从cmd提示符进行tnsping)。