2011-12-22 13 views
8

Si è verificato un errore durante il tentativo di connessione a un database Oracle 10g remoto da un'applicazione C# 2008 Express Edition che sto sviluppando. Sto cercando di utilizzare un approccio minimalista e non intrusivo allo sviluppo in vista della distribuzione ClickOnce sulle workstation degli utenti.Errore durante il tentativo di connessione al database Oracle 10g dal programma C# con configurazione di configurazione minima

Per quanto riguarda quanto sopra ho studiato i seguenti documenti (tra gli altri ..) -

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#

In considerazione dell'errore che ho riscontrato, ho creato una semplice app di test. composto da una singola pagina (wpf) con un solo pulsante. In click-evento del pulsante tento di creare una connessione a un database 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(); 
     } 
    } 
} 

seguito le informazioni negli articoli precedenti ho assicurato che di quanto segue DLL sono nella mia cartella "bin" -

• oci.dll
• Ociw32.dll
• orannzsbb10.dll
• oraocci10.dll
• oraociicus.dll
• Msvcr71.dll

(l'ultimo chiamato in disperazione ...) e hanno fatto riferimento a 'Oracle.DataAccess.dll'.

Il messaggio di errore (a '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();'. 

Inoltre, viene segnalato il seguente -

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

Sto assumendo dal NullReferenceException all'interno del datasource che il problema si trova in una delle DLL '(?) come' nuovo 'l'OracleConnection sopra prima di provare a farvi riferimento.

Inoltre, l'esecuzione del codice salta il "catch (NullReferenceException nullExcept)" e passa direttamente al catch OracleException.

Ci scusiamo per il vagabondaggio ma spero che abbia senso? Qualsiasi aiuto/consiglio apprezzato!

+0

Can voi ping 'myServer'? hai provato a collegarti tramite sqlplus? – V4Vendetta

+0

È possibile eseguire il tnsping di "myOracleDb"? – Shai

+0

La 'NullReferenceException' non è la causa del problema. Si verifica quando si ispeziona l'eccezione in VisualStudio. È un artefatto di debug e può essere ignorato. Sfortunatamente, la vera eccezione sembra non contenere alcun messaggio di errore. O l'hai trascurato da qualche parte? – Codo

risposta

0

Verificare che l'ODAC sia impostato correttamente. Suggerirei di usare TNSNAMES (non dovresti avere tutte le informazioni in una stringa di connessione imo). Vedere la sezione TNSNAMES setup di questo documento (11.2).Vedere anche sezione inferiore per il collegamento comune emette

Una volta fatto, dovrebbe essere facile come mettere la vostra stringa di connessione nella proprietà impostazioni del vostro progetto e di fare:

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

Nel tuo esempio, il tuo oraConnect hasn è stato istanziato (hai appena "OracleConnection oraConnect"), quindi la parte "new OracleConnection" che non riesce si traduce in un'eccezione di riferimento null (se capisco la tua spiegazione di dove si interrompe comunque). Debugger in VS dovrebbe essere d'aiuto anche in questo caso;)

MODIFICA: Si consiglia di impostare una semplice app della console di prova con la sola connessione di apertura/chiusura. Questo potrebbe eliminare qualsiasi rumore diverso dall'ottenere correttamente la configurazione ODAC. Qualcosa di simile (impostazione non testati, assumere tnsnames):

utilizzando ...

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

Prova esecuzione che e riferire ciò che torna dal console.

+0

'oraConnect' è stato istanziato. Vedere la parola chiave 'new' in' utilizzando (oraConnect = new OracleConnection ... '. – Codo

+0

non era chiaro dove questo era in errore esattamente da OP – tbone

1

È successo a me.

Dopo un po 'di voodoo, ho cancellato questa chiave dal mio registro: HKEY_CURRENT_USER\Software\ORACLE e tutto ha funzionato di nuovo bene.

2

OK, molto tardi tornando a questo per cui molte scuse!

Nel frattempo, il nostro DB è stato aggiornato e nel cambiare la lista dll per includere (!) -

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

dalle versioni "10", ancora senza successo, ho modificato App.xaml (seguendo una ricerca estesa qui e sul web) wi th the following -

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

Il bindingRedirect ha fatto il trucco!

La DLL di sembrano essere estremamente dipendente dal numero di versione compatibile

Vorrei poter dire che ho veramente capito come questo funziona, ma lo fa e ora ho le connessioni di lavoro ...

+1

_La dll sembra essere estremamente dipendente da numeri di versione compatibili_ Questo. Oracle non è nulla se non ESTREMAMENTE permaloso, e ho avuto interi server di salvataggio su nient'altro che una mancata corrispondenza della versione XX1/XX2.Quello sarebbe stato il mio suggerimento per il debug, e sono contento che sia stato risolto. Dovresti accettare la tua risposta in modo che altre persone possano trovarla. –