将C#连接到Oracle数据库所需的最小客户端资源是多少?


71

通过在笔记本电脑上下载并安装客户端管理工具和Visual Studio 2008,我已经从C#(Visual Studio 2008)成功连接到Oracle数据库(10g)。

Oracle Client工具的安装占用空间超过200Mb,而且运行时间很长。

有谁知道最小可行的占地面积是多少?我希望这是一个DLL和一个register命令,但是我感觉我需要安装一个oracle home,并设置各种环境变量。

我在代码中使用Oracle.DataAccess。


22
作为Oracle新手,对于我来说,找到并安装所需的所有正确组件和库对我来说也是一场噩梦。我不明白,Oracle如何无法为.NET开发人员提供这种“中等”支持……
splattne

@ecoe感谢您再次提出这个问题。您的答案stackoverflow.com/a/26469797/6910似乎是迄今为止最小的占用空间。
乔纳森

4
@splattne:不错,Oracle为所有开发人员和客户提供了中等的软件。
查尔斯·伯恩斯

Answers:


70

您需要一个Oracle Client才能连接到Oracle数据库。最简单的方法是安装Oracle数据访问组件

为了减少占用空间,我建议如下:

  • 使用框架附带的Microsoft提供程序(Oracle.System.Data.OracleClient)。
  • 下载Oracle Instant Client软件包-Basic Lite:这是一个(几乎)最低要求的zip文件。我建议使用10.2.0.4版,该版本比11.1.0.6.0版小得多。
  • 将以下文件解压缩到特定的文件夹中:
    • v10:
      • oci.dll
      • orannzsbb10.dll
      • oraociicus10.dll
    • v11:
      • oci.dll
      • orannzsbb11.dll
      • oraociei11.dll
  • 在x86平台上,将Visual Studio 2003的CRT DLL(msvcr71.dll)添加到此文件夹中,因为Oracle伙计们忘记阅读此文件了
  • 将此文件夹添加到PATH环境变量中。
  • 在您的应用程序中使用Easy Connect Naming方法来摆脱臭名昭著的TNSNAMES.ORA配置文件。看起来是这样的:sales-server:1521/sales.us.acme.com

总计约19Mb(v10)。

如果您不希望在多个应用程序之间共享此文件夹,则可以选择将上述DLL与应用程序二进制文件一起提供,并跳过PATH设置步骤。

如果您绝对需要使用Oracle提供程序(Oracle.DataAccess),则需要:

  • ODP .NET 11.1.0.6.20(据称与Instant Client一起使用的第一个版本)。
  • 显然,Instant Client 11.1.0.6.0。

请注意,我尚未测试此最新配置...


1
使用Visual Studio 2005,我没有执行第4或第5步就获得了成功
Timothy Carter

就许可而言,将dll包含在您的应用程序中可以吗?
thecoop

Instant Client已获得OTN开发和发行许可证(cf. oracle.com/technology/software/htdocs/client_lic.html)的许可。这意味着您可以随应用程序自由地对其进行重新分发(参见oracle.com/technology/tech/oci/instantclient/ic-faq.html#A4379)。
Mac

5
使用仅安装在我的开发计算机上的ODAC版本11.2.0.1.2,我能够通过复制oci.dll,Oracle.DataAccess.dll,oraociei11.dll和OraOps11w.dll进行部署。我不需要在生产机器上安装任何东西,这太了不起了。我的开发机器是Win7 x64,我在普通的WinXP x86 VM(.NET Framework以及其他功能)上测试了生产。
Pandincus 2010年

1
使用Instant Client Lite并将所有DLL与Oracle.DataAccess.dll一起复制到目标计算机上的应用程序文件夹中,并使用Easy Connection连接字符串使我可以在开发计算机上使用完整的Oracle客户端,然后仅复制这些DLL当我部署并且两种情况下都使用相同的二进制文件时
cjbarth 2011年

15

我在Windows XP上使用ODAC 11.2.0.2.1使用上述Pandicus建议的方法。步骤如下:

  1. 从oracle.com(53 MB)下载“带有Xcopy部署的ODAC 11.2第3版(11.2.0.2.1)”软件包,然后解压缩ZIP。
  2. 收集以下DLL:oci.dll(1 MB),oraociei11.dll(130 MB!),OraOps11w.dll(0.4 MB),Oracle.DataAccess.dll(1 MB)。其余的东西可以删除,无需安装任何东西。
  3. 添加对Oracle.DataAccess.dll的引用,添加using Oracle.DataAccess.Client;到您的代码中,现在您可以使用诸如之类的类型OracleConnectionOracleCommandOracleDataReader访问Oracle数据库。有关详细信息,请参见类文档。无需使用tnsnames.ora配置文件,仅必须正确设置连接字符串
  4. 以上4个DLL必须与可执行文件一起部署。

3
我发现这种工作方法。明显的缺点是,从v11.2开始,oraociei11.dll现在为130MB :(
Martin Suchanek 2012年

15

截至2014年,OPD.NET托管驱动程序是最小的占用空间。

这是与以前(过时)回答建议的非托管版本的代码使用比较:http : //docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148

您将需要Oracle.ManagedDataAccess.dll在项目中下载这些dll和参考:仅下载ODP.NET,托管驱动程序Xcopy版本

这是您需要随发行版打包的典型足迹:

  1. Oracle.ManagedDataAccess.dll
  2. Oracle.ManagedDataAccessDTC.dll

总之,.Net 4.0的容量高达6.4 MB。


您也可以Oracle.ManagedDataAccess.dll通过NuGet下载。
Ragowit

+1000个最简单的解决方案;注意“使用Oracle.ManagedDataAccess.Client;”
Nime Cloud 2015年

如果您在此处描述的连接字符串中使用“没有tnsnames.ora的ODP.NET”技术,则不需要使用Oracle.ManagedDataAccess.dll的tnsnames.ora,sqlnet.ora,注册表设置或环境变量:connectionstrings.com/oracle-data -供应商提供的网络-odp-net
mchestnut

14

通过这种方式,您可以使用来自oracle的5个可再发行文件与ODP.net连接:

克里斯的博客文章:使用新的ODP.Net通过简单的部署从C#访问Oracle

编辑:万一每个博客都失败了,这里是一个简短的摘要...

  • oci.dll
  • Oracle.DataAccess.dll
  • oraociicus11.dll
  • OraOps11w.dll
  • orannzsbb11.dll
  • oraocci11.dll
  • ociw32.dll

确保从相同的ODP.Net/ODAC发行版中获得所有那些DLL,以避免版本号冲突,并将它们全部与EXE放在同一文件夹中


文章说“不需要TnsNames.Ora文件” ...但这只是意味着它不能翻译数据库名称。
Nyerguds

8

DevArt http://www.devart.com/,以前是CoreLab(crlab.com)提供纯C#Oracle客户端。那是一个单独的dll,并且工作正常。


实际上,这与我想要的非常接近。理想情况下,我想要一个仅Oracle的解决方案,但我正在研究这一解决方案。
乔纳森

而且不需要本地Oracle Client安装吗?
Ishmaeel

1
@Ishmaeel它具有“直接”模式,不需要在目标计算机上安装Oracle客户端。
亚当

5

这是Oracle 11.2.0.4.0的更新。我在Windows 7上使用成功完成了以下过程System.Data.OracleClient

1.下载Instant Client Package-Basic LiteWindows 32位64位

2.将以下文件复制到系统路径中的某个位置:

32位

 1,036,288  2013-10-11  oci.dll
   348,160  2013-10-11  ociw32.dll
 1,290,240  2013-09-21  orannzsbb11.dll
   562,688  2013-10-11  oraocci11.dll
36,286,464  2013-10-11  oraociicus11.dll

64位

   691,712  2013-10-09  oci.dll
   482,304  2013-10-09  ociw32.dll
 1,603,072  2013-09-10  orannzsbb11.dll
 1,235,456  2013-10-09  oraocci11.dll
45,935,104  2013-10-09  oraociicus11.dll

3.构造一个不需要tnsnames.ora的连接字符串。

(请参阅下面的测试程序中的示例。)

4.运行此最小的C#程序来测试安装:

using System;
using System.Data;
using System.Data.OracleClient;

class TestOracleInstantClient
{
    static public void Main(string[] args)
    {
        const string host = "yourhost.yourdomain.com";
        const string serviceName = "yourservice.yourdomain.com";
        const string userId = "foo";
        const string password = "bar";

        var conn = new OracleConnection();

        // Construct a connection string using Method 1 or 2.
        conn.ConnectionString =
            GetConnectionStringMethod1(host, serviceName, userId, password);

        try
        {
            conn.Open();
            Console.WriteLine("Connection succeeded.");
            // Do something with the connection.
            conn.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine("Connection failed: " + e.Message);
        }
    }

    static private string GetConnectionStringMethod1(
        string host,
        string serviceName,
        string userId,
        string password
        )
    {
        string format =
            "SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
            "(HOST={0})(PORT=1521))" +
            "(CONNECT_DATA=(SERVER=DEDICATED)" +
            "(SERVICE_NAME={1})));" +
            "uid={2};" +
            "pwd={3};"; // assumes port is 1521 (the default)

        return String.Format(format, host, serviceName, userId, password);
    }

    static private string GetConnectionStringMethod2(
        string host,
        string serviceName,
        string userId,
        string password
        )
    {
        string format =
            "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
            "(HOST={0})(PORT=1521))" +
            "(CONNECT_DATA=(SERVER=DEDICATED)" +
            "(SERVICE_NAME={1})));" +
            "User Id={2};" +
            "Password={3};"; // assumes port is 1521 (the default)

        return String.Format(format, host, serviceName, userId, password);
    }
}

最后提示:如果遇到错误“ System.Data.OracleClient需要Oracle客户端软件版本8.1.7”,请参见此问题


它说:System.Data.OracleClient需要Oracle客户端软件版本8.1.7或更高版本。
尼姆·乌云2015年

@NimeCloud:一种可能性是这可能是文件系统权限问题,导致您的程序无法访问Oracle DLL。请参阅本文这篇文章
DavidRR 2015年


2

我发现在Oracle论坛上的这篇帖子也非常有用:

如何使用Visual Studio设置Oracle Instant Client

备注:ADO.NET团队不赞成使用System.Data.OracleClient,因此对于以后的项目,您应该使用ODP.NET

再生产:

设置以下环境变量:

  1. 确保PATH中没有其他Oracle目录
  2. PATH设置为指向即时客户端
  3. 将您的TNS_ADMIN设置为指向tnsnames.ora文件所在的位置
  4. 设置您的NLS_LANG
  5. 将您的ORACLE_HOME设置为即时客户端

对我来说,我将NLS_LANG设置为

http://download-east.oracle.com/docs/html/A95493_01/gblsupp.htm#634282

我通过使用即时客户端的sqlplus附加组件来验证这是否使用了正确的客户端软件。

对我来说,我设置了:SET NLS_LANG = AMERICAN_AMERICA.WE8MSWIN1252

注意:在进行任何更改之前,请备份Oracle注册表项(如果存在)并备份任何环境变量的字符串。

在此处阅读Oracle Instant Client常见问题解答

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.