8

以前のバージョンの ODP.NET がインストールされているサーバーに MVC、EF、ODAC 11.2.0.3 アプリをデプロイできるかどうかを調べようとしています。サーバーの ODP.NET を更新するのではなく (私にはできません)、Oracle Instant Client を使用できると考えました。

これは実行可能ですか?

1) Instant Client をサポートするために、これらの dll をプロジェクトに追加しました。

-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)これ(私の知る限り)は、GACではなくビンでOracle dllを使用する方法です

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

4) 最後に私の接続文字列

    <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 Data Provider が見つかりませんというエラーです。インストールされていない可能性があります。

ここで何か助けていただければ幸いです。私はかなり新しく、学ぶことがたくさんあります。前もって感謝します。乾杯

4

4 に答える 4

3

<remove … />Web 構成の要素にセクションを追加して<DbProviderFactories>、既存の Oracle プロバイダーを削除します。(の前<add>)

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

于 2012-04-02T17:58:15.337 に答える
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>

app.config

(以下のタグに注意してください<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 リリース 5 (11.2.0.3.20) XCopy バージョンをダウンロード [2012 年 9 月 11 日リリース]

このzipファイルを解凍しました。

これらのファイルを検索して釣り上げました:

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

同じ名前のファイルが 2 つある場合、3.5 フレームワークのニーズに合わせて "bin\2.x\" または "odp.net20\bin" バージョンを使用したことに注意してください (まだ 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 に答える
1

あなたの質問から、xcopy デプロイメント許可のみを使用して、アプリケーションと ODP.net の新しいバージョンに更新をデプロイする必要があるようです。

アプリケーションが変更されるため、アセンブリ バインディングの変更や DbProviderFactories は必要ありません。クラスライブラリのcsprojをedmxなどで更新して、新しい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 に答える