Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用odp.net和OCI从C连接到Oracle#_C#_Oracle_.net 4.0_Odp.net_Oracle Call Interface - Fatal编程技术网

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

C# 使用odp.net和OCI从C连接到Oracle#,c#,oracle,.net-4.0,odp.net,oracle-call-interface,C#,Oracle,.net 4.0,Odp.net,Oracle Call Interface,我一直在读关于如何从C#win应用程序连接到oracle数据库的文章,但我一直在“碰壁”。我已经决定使用odp.net和OCI,这样客户端计算机就不需要安装客户端,但我无法让它工作 我有一个小的测试应用程序,代码如下所示,在我的解决方案中,我添加了来自oracle OCI的以下dll:OCI.dll、orannzsbb11.dll和oraociicus11.dll。它们都与最终的.exe文件放在一起 测试代码: private static string CONNECTION_STRING =

我一直在读关于如何从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正常工作,我需要做什么?

通常在使用OCI或Oracle数据库产品时,应该定义Oracle_HOME环境变量并指向Oracle安装。在库旁边,Oracle确实使用了一些其他支持文件,它正在Oracle_HOME中搜索这些文件。通常,LD_LIBRARY_路径定义为ORACLE_HOME/lib。尝试使用,这很可能比手动选择几个lib要好。 这里有一篇关于如何让它工作的好文章:您可以省略关于sqlplus的部分

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

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


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

请阅读Oracle for ODAC的安装说明。本文还讨论了常见的设置问题


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

为了能够在不安装完整客户端的情况下使用ODP.NET,您需要使用这些包(不能仅从完整的客户端复制库):

  • 有关要求的说明
  • 从Oracle v10开始,我强烈建议使用来简化连接字符串。这个怎么样:

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

OracleConnection类是System.Data.OracleClient还是Oracle.DataAccess.Client命名空间的一部分?(您的描述有点让人困惑,因为ODP.NET是可用的最重的客户端。)它是Oracle.DataAccess.client—我唯一想要实现的是能够连接到Oracle数据库而无需安装客户端!你不使用ODP.NET,是吗?如果您安装了ODP.NET,您将经历一次全面的Oracle客户端安装,其中包括OCI和许多注册表设置。我的计划是使用odp.net,是的,我已经完成了完整的安装,以获得所有的dll。我使用opd.net,这样我就可以使用工厂实例,因为我有一个通用的数据库层,因为我的应用程序使用多个DBMS。我已经尝试过即时客户端,但我无法让它工作。如何设置使用即时客户端的win应用程序,以及如何将其与应用程序一起发布,以便用户无需执行任何操作?请确保Oracle LIB为其定义了环境变量Oracle_HOME。要进行测试,最简单的方法是在启动应用程序之前使用命令shell并在其中设置环境。我不知道Oracle是如何做到这一点的,但我认为不允许您将客户端与应用程序相结合。为此,最好咨询Oracle代表,他们有可能对您有用的解决方案。@aweis我更新了答案,提供了有关重新分发的更多信息和对howto的参考。我读过这篇文章并尝试过,但没有成功。当我从VS2008运行时,它可以工作(我认为它以某种方式使用了我安装的客户端),但exe文件失败。实际上,它只是在“neworacleconnection(CONNECTION\u STRING)”行停止工作。应用程序没有崩溃,只是没有超出此语句的范围,您知道它为什么会这样做吗?尝试激活跟踪:(请参阅TraceLevel和TraceFileName参数)。使用即时客户端库…我使用了Xcopy版本,发现代码正常工作,但只花了大约一分钟就发现日志文件夹丢失,然后它继续执行代码。现在我手动添加了这个文件夹,看起来一切都正常。