2011-12-22 7 views
8

Występuje błąd podczas próby połączenia ze zdalną bazą danych Oracle 10g z rozwijanej przeze mnie aplikacji C# 2008 Express Edition. Próbuję użyć minimalistycznego, nieinwazyjnego podejścia do rozwoju z myślą o wdrożeniu ClickOnce na stacjach roboczych użytkowników.Błąd podczas próby połączenia z bazą danych Oracle 10g z poziomu programu C# z minimalną konfiguracją

W związku z powyższym mam badane następujące dokumenty (między innymi ..) -

What is the minimal setup required to deploy a .NET application with Oracle client 11?

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

Connect to Oracle with odp.net and the OCI from C#

W związku z występującym błędem utworzyłem prostą aplikację testową. składający się z jednej strony (wpf) z jednym przyciskiem. W kliknięciem przypadku przycisku próbuję utworzyć połączenie z bazą danych 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(); 
     } 
    } 
} 

następstwie informacji w powyższych artykułach mam zapewnione, że po DLL są w moim katalogu „bin” -

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

(ostatni nazwany w desperacji ...) i odwołał się do "Oracle.DataAccess.dll".

Komunikat o błędzie (na 'catch (OracleException dbEx)') jest -

"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();'. 

Ponadto następuje zgłaszane -

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

Jestem zakładając od wewnątrz NullReferenceException źródło danych, że problem leży w jednym z bibliotek DLL (?), ponieważ jestem "nowy" OracleConnection powyżej, zanim spróbuję go odnieść.

Ponadto wykonanie kodu powoduje przejście do "catch (NullReferenceException nullExcept)" i przechodzi bezpośrednio do catchu OracleException.

Przepraszam za wędrówkę, ale mam nadzieję, że ma to sens? Każda pomoc/rada doceniona!

+0

Czy ty ping 'myServer'? czy próbowałeś połączyć się przez sqlplus? – V4Vendetta

+0

Czy możesz tnsping "myOracleDb"? – Shai

+0

Wyjątek "NullReferenceException" nie jest przyczyną problemu. Występuje, gdy sprawdzasz wyjątek w VisualStudio. To artefakt do debugowania i można go zignorować. Niestety, prawdziwy wyjątek wydaje się nie zawierać żadnych komunikatów o błędach. A może przeoczyłeś to gdzieś? – Codo

Odpowiedz

0

Upewnij się, że ODAC jest poprawnie skonfigurowany. Proponuję użyć TNSNAMES (nie powinieneś mieć wszystkich tych informacji w łańcuchu połączeń imo). Zobacz rozdział TNSNAMES setup tego dokumentu (11.2).patrz także sekcja dolna do wspólnego połączenia wystawia

Po dokonaniu rejestracji, powinno być tak proste, jak oddanie ciąg połączenia w nieruchomości ustawień swojego projektu i wykonanie:

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

W przykładzie Twój oraConnect hasn Został utworzony (po prostu masz "OracleConnection oraConnect"), więc część "nowa OracleConnection", która zawodzi, skutkuje wyjątkiem odwołującym się do wartości zerowej (jeśli rozumiem twoje wyjaśnienie, gdzie i tak było przerwanie). Powinien tu również pomóc debugger w VS;)

EDIT: Możesz skonfigurować prostą konsolę testową z tylko otwartym/zamkniętym połączeniem. Może to wyeliminować wszelkie zakłócenia poza poprawnym skonfigurowaniem ODAC. Coś podobnego (Setup niesprawdzone załóżmy TNSNAMES):

używając ...

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(); 
     } ... 

Spróbuj uruchomić to i zgłosić co wraca z konsoli.

+0

Utworzono instancję 'oraConnect'. Zobacz słowo kluczowe 'new' w' using (oraConnect = new OracleConnection ... '. – Codo

+0

nie było jasne, gdzie to było dokładnie z OP – tbone

1

To mi się przydarzyło.

Po odrobinie voodoo, usunąłem ten klucz z mojego rejestru: HKEY_CURRENT_USER\Software\ORACLE i wszystko znów działało dobrze.

2

OK, bardzo późno wracam do tego, za co przepraszam!

W międzyczasie, nasz DB został uaktualniony i zmienia listę dll do include (!) -

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

z wersji "10", wciąż bez powodzenia, edytowałem App.xaml (po obszernym wyszukiwaniu tutaj i w Internecie) wi Następujący -

<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> 

The bindingRedirect załatwił sprawę!

DLL użytkownika wydaje się być niezwykle zależne kompatybilnych numery wersji

chciałbym móc powiedzieć, że naprawdę rozumieć jak to działa, ale to robi i teraz mam połączenia pracy ...

+1

_Dll wydaje się być bardzo zależne od kompatybilnych numerów wersji_ To. Oracle jest niczym, jeśli nie NIESAMOWICIE DOTYKOWY, a moje serwery dostały wsparcie tylko w przypadku niedopasowania wersji XX1/XX2.To była moja sugestia debugowania i cieszę się, że to rozwiązano. Powinieneś zaakceptować własną odpowiedź, aby inni mogli ją znaleźć. –

Powiązane problemy