8

開発中の C# 2008 Express Edition アプリケーションからリモートの Oracle 10g データベースに接続しようとすると、エラーが発生します。私は、ユーザー ワークステーションへの ClickOnce 展開を視野に入れて、開発に最小限の非侵入型アプローチを使用しようとしています。

上記に関して、私は次のドキュメントを調査しました(とりわけ..)-

Oracle クライアント 11 で .NET アプリケーションを展開するために必要な最小限の設定は何ですか?

http://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/

http://ora-00001.blogspot.com/2010/01/odpnet-minimal-non-intrusive-install.html

http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c

C# から odp.net と OCI を使用して Oracle に接続する

私が経験したエラーを考慮して、簡単なテストアプリを作成しました。ボタンが 1 つある単一 (wpf) ページで構成されます。ボタンのクリックイベントで、Oracleデータベースへの接続を作成しようとしました-

private void button1_Click( object sender, RoutedEventArgs e )
{
    OracleConnection oraConnect;

    // string previously used OK in other projects
    string connectionString = "Data Source=" +
           "(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = myServer)(PORT = 1521)))" +
           "(CONNECT_DATA =(SERVICE_NAME = myOracleDb)))" +
           ";Password=myPw;User ID=myID;";

    using ( oraConnect = new OracleConnection( connectionString ) )
    {
        try
        {
            if ( oraConnect.State == ConnectionState.Closed )
            {
                oraConnect.Open();
                MessageBox.Show( "oraConnect is attempting to open.." );
            }
            else
                MessageBox.Show( "oraConnect open to DB: " + oraConnect.ServerVersion.ToString() );
        }
        catch ( NullReferenceException nullExcept )
        {
            MessageBox.Show( "Caught error: ." + nullExcept.ToString() );
        }
        catch ( OracleException dbEx )
        {
            MessageBox.Show( "OraException - " + dbEx.Message.ToString());
        }
        catch ( Exception ex )
        {
            Exception current;
            current = ex;

            while ( current != null )
            {
                current = current.InnerException;
            }

            MessageBox.Show( "Db base exception - " + ex.GetBaseException().ToString() );
        }
        finally
        {
            oraConnect.Close();
        }
    }
}

上記の記事の情報に従って、次の Dll が「bin」フォルダーにあることを確認しました -

• oci.dll
• ociw32.dll
• orannzsbb10.dll
• oraocci10.dll
• oraociicus.dll
• msvcr71.dll

(絶望的に最後に名前が付けられました...)そして「Oracle.DataAccess.dll」を参照しました。

エラーメッセージ ('catch ( OracleException dbEx )') は -

"Oracle.DataAccess.Client.OracleException was caught
  Message=""
  StackTrace:
       at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
       at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
       at Oracle.DataAccess.Client.OracleConnection.Open()
       at OracleConnectionTest.Window1.button1_Click(Object sender, RoutedEventArgs e) in C:\Documents\Visual Studio 2008\Projects\OracleConnectionTest\OracleConnectionTest\Window1.xaml.cs:line 69
  InnerException: "

Line 69 is 'oraConnect.Open();'.

さらに、次のことが報告されています -

"((Oracle.DataAccess.Client.OracleException)($exception)).DataSource' threw an exception of type 'System.NullReferenceException".

データソース内の NullReferenceException から、参照しようとする前に上記の OracleConnection を「新規」にしたため、問題は dll の 1 つにあると想定しています (?)。

さらに、コード実行は「catch ( NullReferenceException nullExcept )」にジャンプし、直接 OracleException catch に進みます。

とりとめのない話で申し訳ありませんが、これが理にかなっていることを願っていますか? ヘルプ/アドバイスをいただければ幸いです。

4

3 に答える 3

2

OK、これに戻るのが非常に遅くなりました。

暫定的に、DB がアップグレードされ (!)、dll リストが次のように変更されました -

  • oraocci11.dll
  • oraociccus11.dll
  • OraOps11w.dll
  • orannzsbb1.dll

「10」バージョンから、まだ成功していませんが、App.xamlを編集しました(こことWebで広範な検索を行った後)。

    <system.data>
      <DbProviderFactories>
         <add name="OracleClient Data Provider"
              invariant="System.Data.OracleClient"
              description=".Net Framework Data Provider for Oracle"
              type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=##################"/>
      </DbProviderFactories>
   </system.data>

   <!-- publicKeyToken obtained using Reflector to investigate dll -->
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="Oracle.DataAccess"
                              publicKeyToken="##################"
                              culture="neutral"/>
            <bindingRedirect oldVersion="10.2.0.100" 
                             newVersion="2.112.2.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>

bindingRedirect がうまくいきました!

dll は、互換性のあるバージョン番号に大きく依存しているようです

これがどのように機能するかを本当に理解したと言えたらいいのにと思いますが、実際に機能し、接続が機能しています...

于 2013-12-04T09:52:36.410 に答える
1

それは私に起こりました。

ちょっとしたブードゥー教の後、私はこのキーをレジストリから削除しHKEY_CURRENT_USER\Software\ORACLEました。そして、すべてが再び正常に機能しました。

于 2012-05-23T08:42:18.743 に答える
0

ODAC が正しく設定されていることを確認します。TNSNAMES を使用することをお勧めします (接続文字列 imo にすべての情報を含める必要はありません)。このドキュメント (11.2)のTNSNAMES セットアップセクションを参照してください。一般的な接続の問題については、下部のセクションも参照してください

それが完了したら、プロジェクトの設定プロパティに接続文字列を配置して実行するのと同じくらい簡単です。

oraConnect = new OracleConnection(Properties.Settings.Default.MyConnString);

あなたの例では、oraConnectはインスタンス化されていません(「OracleConnection oraConnect」があるだけです)ので、失敗した「新しいOracleConnection」部分はnull参照例外になります(とにかく壊れている場所の説明を理解している場合)。ここでもVSのデバッガーが役立つはずです;)

編集: 接続を開く/閉じるだけの簡単なテスト コンソール アプリをセットアップすることができます。これにより、ODAC を適切にセットアップする以外のノイズが排除される場合があります。次のようなもの (未テスト、tnsnames セットアップを想定):

...を使用して

namespace Testbed {
  class Program {
    static void Main(string[] args) {
      try {
        string connStr="User Id=my_user;Password=my_pass;Data Source=my_sid;";
        OracleConnection oraConnect = new OracleConnection(connStr);
        oraConnect.Open();
        Console.WriteLine("Opened Connection");
        oraConnect.Close();
        Console.WriteLine("Complete");
        Console.ReadLine();
      catch (System.Exception e) {
        Console.WriteLine(e.Message);
        Console.ReadLine();
      } ...

それを実行してみて、コンソールから返されたものを報告してください。

于 2011-12-22T13:20:39.383 に答える