代码之家  ›  专栏  ›  技术社区  ›  Fantius

我能以在单声道环境(Linux)和ClickOnce部署(Windows)中工作的方式连接到Oracle数据库吗?

  •  1
  • Fantius  · 技术社区  · 14 年前

    显然,我不想安装Oracle客户机(而不仅仅是一个DLL),因为这将禁止我的ClickOnce目标。我尝试过System.Data.OracleClient,但它抛出了一个异常:“System.Data.OracleClient需要Oracle客户端软件版本8.1.7或更高版本。”

    更新:
    似乎System.Data.OracleClient不是一个好方法。所以我下载了OracleODP.NET提供程序的xcopy版本。然后我运行“install.bat odp.net20 c:\oracle odac”只安装odp.net。然后我在我的项目中添加了对c:\oracle\odp.net\bin\2.x\oracle.dataaccess.dll的引用。这让我可以访问Oracle数据库。但是当我把所有文件都放到一个干净的机器上(包括Oracle DLL)时,我得到一个异常:“Oracle.DataAccess.Client.OracleConnection的类型初始值设定项抛出了一个异常。”因此,它似乎仍然依赖于其他一些文件。但我不知道什么文件。它怎么知道文件在哪里?注册表项?不适合ClickOnce。

    更新:
    只要我包含mcauthorn:oci.dll、oracle.dataaccess.dll、oraociei11.dll和oraops11w.dll提到的文件,它就可以工作。不幸的是,oraocie11.dll非常大——114MB。

    3 回复  |  直到 10 年前
        1
  •  2
  •   mcauthorn    14 年前

    我想去拿odp.net DLL here . 您必须获取xcopy版本,然后将必要的dll添加到项目中,然后您就可以开始了。System.Data.OracleClient已停止使用,Microsoft不建议使用。

        2
  •  0
  •   user38123    14 年前

    您可以使用第三方ADO.NET提供程序。尝试 this one . 它不需要Oracle客户端,并且运行在Mono上。

        3
  •  0
  •   peter    10 年前

    更新,因为原始答案是4岁。

    只需使用Oracle的托管驱动程序。你只需要那个,其他什么都不需要。然后您可以使用一个简单的连接字符串直接连接到数据库。

    <system.data>
      <DbProviderFactories>
        <remove invariant="Oracle.ManagedDataAccess.Client" />
        <!-- If any should be in the machine.config -->
        <add name="Oracle Data Provider for .NET" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral" />
      </DbProviderFactories>
    </system.data>
    <connectionStrings>
      <clear />
      <add name="OracleContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="DATA SOURCE=<IP_ADDRESS>:1521/XE;PASSWORD=<PASSWORD>;USER ID=<USER_ID>;Connection Timeout=600;Validate Connection=true" />
    </connectionStrings>
    

    我使用了ServiceStack的Ormlite作为ORM,但是如果您不想使用ORM,或者与其他任何ORM一起使用,它也应该可以很好地直接工作。您只需确保ORM库也在使用托管驱动程序,而不是旧的驱动程序。我写了一篇关于黑客的博客文章,在那里我不得不更改servicestack.ormlite.oracle来使用新的托管驱动程序。这解决了我所有的问题。