it-swarm.cn

将C#连接到Oracle数据库所需的最小客户端占用空间是多少?

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

Oracle客户端工具的安装占用空间超过200Mb,而且耗时很长。

有谁知道最小可行足迹是什么?我希望它是一个DLL和一个寄存器命令,但我觉得我需要安装一个Oracle主页,并设置各种环境变量。

我在我的代码中使用Oracle.DataAccess。

71
Jonathan

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

为了减少占地面积,我建议如下:

  • 使用随框架提供的Microsoft提供程序for Oracle(System.Data.OracleClient)。
  • 下载 Oracle Instant Client Package - Basic Lite:这是一个Zip文件(几乎)最低限度。我推荐版本10.2.0.4,它比版本11.1.0.6.0小得多。
  • 解压缩特定文件夹中的以下文件:[。_____。]
    • 第10节:
      • oCI.DLL
      • orannzsbb10.dll
      • oraociicus10.dll
    • 第11节:
      • oCI.DLL
      • orannzsbb11.dll
      • oraociei11.dll
  • 在x86平台上,将Visual Studio 2003(msvcr71.dll)的CRT DLL添加到此文件夹,因为Oracle的人忘了 读取这个 ...
  • 将此文件夹添加到PATH环境变量。
  • 在您的应用程序中使用 Easy Connect命名 方法来摆脱臭名昭着的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。

请注意,我还没有测试过这个最新配置......

69
Mac

截至2014年,OPD.NET,托管驱动程序占地面积最小。

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

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

这是您需要在发布时打包的典型足迹:

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

总之,a whopping 6.4 MB for .Net 4.0。

16
ecoe

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

  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必须与您的可执行文件一起部署。
15
kol

这种方式允许您使用Oracle中的5个可再发行文件与ODP.net连接:

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

编辑:如果博客每次都下降,这里是一个简短的总结......

  • oCI.DLL
  • Oracle.DataAccess.dll
  • oraociicus11.dll
  • OraOps11w.dll
  • orannzsbb11.dll
  • oraocci11.dll
  • oCIW32.DLL

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

14
Fidel

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

8
Thomas Boesen

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

1. Download Instant Client Package - Basic Lite Windows 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”,请参阅 这个问题

5
DavidRR

ODAC xcopy将为您带来大约45MB的空间。 http://www.Oracle.com/technology/software/tech/windows/odpnet/index.html

3
smo

我在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 FAQ

2
Vincent De Smet