2011-12-22 23 views
8

我嘗試從正在開發的C#2008速成版應用程序連接到遠程Oracle 10g數據庫時遇到錯誤。我試圖在開發中使用極簡主義的非侵入式方法,以便將ClickOnce部署到用戶工作站。嘗試從採用最小設置配置的C#程序連接到Oracle 10g數據庫時出錯

就上述調查過下列文件(除其他..) -

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#

鑑於我遇到的錯誤,我創建了一個簡單的測試應用程序。由一個單一(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'。

(在 '趕上(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假設數據源問題在於其中一個DLL(?),因爲我在嘗試引用它之前'新建'上面的OracleConnection。

此外,代碼執行會跳轉'catch(NullReferenceException nullExcept)' 並直接進入OracleException catch。

對不起,但希望這是有道理的? 任何幫助/建議表示讚賞!

+0

你能ping'myServer'?你嘗試通過sqlplus連接嗎? – V4Vendetta 2011-12-22 12:34:58

+0

你可以t''myOracleDb'嗎? – Shai 2011-12-22 12:45:20

+0

'NullReferenceException'不是問題的原因。它發生在您檢查VisualStudio中的異常時。這是一個調試工件,可以忽略。不幸的是,真正的異常似乎不包含任何錯誤信息。或者你在某處忽略了它? – Codo 2011-12-22 12:48:44

回答

0

確保ODAC設置正確。我會建議使用TNSNAMES(你不應該有連接字符串IMO中的所有信息)。請參閱本文檔的TNSNAMES setup部分(11.2)。也看到了通用連接底部發出

一旦這樣做了,就應該儘可能把你的連接字符串中項目的設置屬性,做一樣簡單:

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

在你的榜樣,你的oraConnect不是招沒有被實例化(你只有「OracleConnection oraConnect」),所以失敗的「新OracleConnection」部分會導致一個空引用異常(如果我理解你的解釋是它的破壞在哪裏)。在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(); 
     } ... 

試運行和報告從什麼控制檯回來。

+0

'oraConnect'已經被實例化。在使用(oraConnect = new OracleConnection ...)中查看'new'關鍵字 – Codo 2011-12-22 14:01:56

+0

並不清楚這是從OP – tbone 2011-12-22 14:23:42

1

它發生在我身上。

經過一段伏都教之後,我從我的註冊表中刪除了這個密鑰:HKEY_CURRENT_USER\Software\ORACLE,一切正常。

2

好的,很晚纔回到這很多道歉!

在此期間,我們的數據庫已經升級,並在不斷變化的DLL列表包括:(!) -

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

從'10'版本,仍然沒有成功,我編輯了App.xaml(在這裏和在網上廣泛搜索)wi th以下 -

<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的似乎是非常依賴於兼容的版本號

希望我能說我真正理解如何這個工作,但它確實和我現在有工作連接...

+1

中完全失敗的位置_該dll似乎非常依賴於兼容的版本號_這個。 EXTREMELY touchy,我已經讓整個服務器在XX1/XX2版本不匹配的情況下紓困。這將是我的調試建議,我很高興這個問題得到解決。你應該接受你自己的答案,以便其他人可以找到答案。 – 2015-08-06 13:20:29

相關問題