8

我正在尝试学习并弄清楚是否可以将 MVC、EF、ODAC 11.2.0.3 应用程序部署到安装了以前版本的 ODP.NET 的服务器上。我认为我可以使用 Oracle Instant Client,而不是更新服务器 ODP.NET(我不能)。

这是可行的吗?

1) 我将这些 dll 添加到我的项目中以支持 Instant Client

-Oracle.DataAccess.dll

-oci.dll

-ociw32.dll

-orannzsbb11.dll

-oraociei11.dll

-OraOps11w.dll

2)接下来我更新了 dbProviderFactories 的 web.config

   <system.data>
    <DbProviderFactories>
    <add name="Oracle Data Provider for .NET"
    invariant="Oracle.DataAccess.Client"
    description="Oracle Data Provider for .NET"
    type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess,    Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
    </system.data>

3)这(afaik)是如何在bin中使用Oracle dll而不是GAC

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" />
    <publisherPolicy apply="no" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

4)最后我的connectionString

    <connectionStrings>
    <add name="Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client;
provider connection string=&quot;DATA SOURCE=XXX;PASSWORD=XXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

这是我收到的错误无法找到请求的 .Net Framework 数据提供程序。它可能没有安装。

我非常感谢这里的任何帮助。我比较新,还有很多东西要学。提前致谢。干杯

4

4 回答 4

3

在 Web 配置的元素中添加一个<remove … />部分<DbProviderFactories>以删除任何现有的 Oracle 提供程序。(之前<add>

<remove invariant ="Oracle.DataAccess.Client" />

于 2012-04-02T17:58:15.337 回答
1

从您的问题看来,您需要仅使用 xcopy 部署权限为您的应用程序和新版本的 ODP.net 部署更新。

由于您的应用程序正在更改,因此您不需要更改程序集绑定或 DbProviderFactories。只需使用您的 edmx 等更新类库的 csproj 即可参考新的 ODP.net 版本,例如

<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" />

如果您的 tnsnames.ora 出现问题,则必须执行以下操作之一:a) 添加系统环境变量 TNS_ADMIN 以指向 tnsnames.ora 的目录,或 b) 将连接字符串更改为基于:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;

c) 看看您是否可以将 tnsnames.ora 的副本放在其他地方。

于 2012-03-29T07:57:25.870 回答
1

这是我的 Xcopy 解决方案。

我把它贴在

https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181

也是。

但我想我可以在这里发布我的 xml 而不会出现格式问题。

Nuget“packages.config”

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CommonServiceLocator" version="1.0" targetFramework="net35" />
  <package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net35" />
  <package id="EnterpriseLibrary.Data" version="5.0.505.0" targetFramework="net35" />
  <package id="EntLibContrib.Data.OdpNet" version="5.0.505.0" targetFramework="net35" />
  <package id="Unity" version="2.1.505.2" targetFramework="net35" />
  <package id="Unity.Interception" version="2.1.505.2" targetFramework="net35" />
</packages>

应用程序配置

(注意<clear />下面的标签。这可能需要也可能不需要,但我认为最好清除它们,因为您不知道 machine.config 文件中可能包含什么)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>


  <dataConfiguration defaultDatabase="OracleMainConnectionString">
  </dataConfiguration>

  <connectionStrings>

    <add name="OracleMainConnectionString"
         connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyOracleServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyServiceName)));User ID=MyUserName;Password=MyPassword;"
      providerName="Oracle.DataAccess.Client" />
  </connectionStrings>

  <appSettings>
    <add key="ExampleKey" value="ExampleValue" />
  </appSettings>

  <system.data>
    <DbProviderFactories>
      <clear />
      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <add name="EntLibContrib.Data.OdpNet" invariant="EntLibContrib.Data.OdpNet" description="EntLibContrib Data OdpNet Provider" type="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" />
    </DbProviderFactories>
  </system.data>


</configuration>

我正在 x64 Windows 7 机器上开发。

我下载了:ODAC1120320Xcopy_32bit.zip(来自 oracle.com)

哪一个是:

ODAC 11.2 Release 5 (11.2.0.3.20) 下载 XCopy 版本 [2012 年 9 月 11 日发布]

我解压了这个 zip 文件。

我搜索并找出了这些文件:

oci.dll Oracle.DataAccess.dll orannzsbb11.dll oraociei11.dll OraOps11w.dll

请注意,当有 2 个同名文件时,我选择了“bin\2.x\”或“odp.net20\bin”版本来满足我的 3.5 框架需要(我还没有使用 4.0)。

我把这些文件放在我的 .sln 文件所在的子文件夹中。

.\MySolution.sln
.\MyConsoleApplicationFolder\MyConsoleApp.csproj
.\ThirdPartyReferences\
.\ThirdPartyReferences\Oracle\

我把上面的所有文件都放在

.\ThirdPartyReferences\Oracle\ 

文件夹

我使用“添加引用”将 Oracle.DataAccess.dll 的引用添加到“MyConsoleApp.csproj”csharp 项目中。(这意味着浏览到“..\ThirdPartyReferences\Oracle\”当然)

我使用“构建后事件”来复制“额外”(又名“附件)”文件

我在后期构建活动中的台词是:

copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oci.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\orannzsbb11.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oraociei11.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\OraOps11w.dll $(TargetDir)*.*

请注意,我的后期构建事件替换了上面 URL 说明中的“如果更新则复制”。

当我运行我的项目时............我得到了一些缺少的 dll 错误。

注意:在调用 EnterpriseLibrary.Data 对象的程序集中……你会得到“找不到 Microsoft.Practices.SomethingSomething 命名空间。只需继续添加对这些 dll 的引用(上面的 package.config 将下拉),直到错误消失。

就像这里是一个特定的:

"Could not load file or assembly 'Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified."

所以(当然在运行 Nuget 之后,要下载所有文件)我去添加了一个参考:

\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll

这解决了问题。

还有我的 csharp 代码:(注意“select *”仅用于演示目的)

/*
    using System;
    using System.Data;
    using System.Data.Common;
    using Microsoft.Practices.EnterpriseLibrary.Data;
 */
public IDataReader EmployeesGetAll()
{

    IDataReader returnReader = null;

    try
    {

        Database db = DatabaseFactory.CreateDatabase();
        DbCommand dbc = db.GetSqlStringCommand("SELECT * FROM ( SELECT * FROM TEMPLOYEE ) WHERE ROWNUM <= 25");
        returnReader = db.ExecuteReader(dbc);
        return returnReader;

    }

    finally
    {
    }

}

它奏效了。

谢谢:

https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181

我认为这使 ODP.NET 成为“xcopy”部署。

我仍然需要在干净的机器上进行测试才能确定。

但它的一天结束.......

=================

附加信息:

上面的一切都是正确的。但是,我遇到了一个警告。我正在使用“控制台应用程序”来测试我的代码。

当您将新的控制台应用程序添加到 Visual Studio 时,它默认为 x86。

如此处所示:

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

编辑:(更新链接)

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

因此,当我将所有配置和代码以及其他东西放入一个真实项目(在 x64 位机器上设置为“任何 CPU”)时……我所做的一切都停止了工作。:<

稍作调整后......我在 oracle.com ODAC1120320Xcopy_x64.zip 上找到了这个文件,然后我重复了上面所做的一切,但搜索了这个 x64 zip 文件的解压缩文件。

一切正常。

但是控制台应用程序的“x86”默认设置让我陷入了循环。

于 2013-01-22T22:27:29.690 回答
0

通过 Instant Client 部署 ODP.NET 时,我遇到了同样的错误(未找到数据提供程序)。我唯一需要做的就是将以下内容添加到我的 exe.config 文件中(在标签内)

<system.data>
<DbProviderFactories>
<add name="Oracle Data Provider for .NET"
invariant="Oracle.DataAccess.Client"
description="Oracle Data Provider for .NET"
type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess,    Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
于 2013-10-15T09:41:06.837 回答