2016-06-29 198 views
0

我收到此錯誤(我用Oracle.DataAccess DLL):Oracle連接打開錯誤

{Oracle.DataAccess.Client.OracleConnection} 

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

堆棧跟蹤:

at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 
errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* 
pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 
isRecoverable) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, 
OracleConnection conn, IntPtr opsErrCtx, Object src) 
    at Oracle.DataAccess.Client.OracleConnection.Open() 

代碼:

using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString)) 
      { 
       using (OracleCommand cmd = conn.CreateCommand()) 
       { 
        cmd.CommandText = "<<Procedure Name>>"; 
        cmd.Parameters.Add("v_cur", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 

        conn.Open(); --line throws exception 
        using (OracleDataReader reader = cmd.ExecuteReader()) 
        { 
         while (reader.Read()) 
         { 
          retVal = reader["VALUE"].ToString(); 
         } 
         reader.Close(); 
        } 
       } 
      } 

任何輸入內容會有幫助嗎?謝謝。

+0

您從未共享過實際的錯誤消息。 – mason

+0

更新,謝謝。 – Sharpeye500

+1

如果你還沒有,可以嘗試的一件事是運行DLL的託管(Oracle.ManagedDataAccess.dll)版本而不是非託管的版本,我發現它修復了我的一些奇怪的oracle連接問題。託管版本是自包含的,不依賴於Oracle客戶端,它可以在32位和64位無縫工作 – omaraguirre

回答

1

一件事,如果你沒有,你可以嘗試,是運行DLL,而不是管理的非託管(Oracle.ManagedDataAccess.dll)版本,我發現,它修復了一些我奇怪的甲骨文連接問題。託管版本是獨立的,不依賴Oracle客戶端上,它工作在32位和64位無縫

0

嘗試了omaraguirre用戶在評論中提出的建議。

只需遵循這些步驟,它可能會有所幫助。

  1. 從項目中刪除現有引用Oracle.DataAccess和下載的文件夾添加一個新的Oracle.ManagedDataAccess.dll:odp.net \管理\ COMMON \ Oracle.ManagedDataAccess.dll。

  2. 設置它的屬性Copy Local = True,這樣它將與您的項目一起部署。

  3. 不要忘記添加一個新的「使用」行到您的代碼:使用Oracle.ManagedDataAccess.Client;

  4. 您現在可以將項目平臺目標更改爲AnyCPU,並且它將工作。

2

我從甲骨文網站下載ODAC121021Xcopy_32bit和提取的ZIP和使用install.bat文件安裝。

我確實遇到了同樣的問題。感謝Omaraguirre。正如Omaraguirre所述,引用了Oracle.ManagedDataAccess.dll並解決了該問題。我可以在沒有任何問題的情況下打開連接。

但我想弄清楚爲什麼Oracle.DatAccess.dll在嘗試打開連接時拋出Null引用異常。我發現支持dll(oci.dll,ociwin32.dll等)需要打開連接而不出錯。 因此,我將instantclient_12_1(此文件夾位於解壓縮的ODAC121021Xcopy_32bit文件夾內)文件夾中的所有dll文件複製到oracle安裝的bin目錄(C:\ oracle \ bin,在我的機器中)。現在,Oracle.DataAccess.dll在打開連接時不會引發錯誤。

還有一件事是Oracle.ManagedDataAccess.dll將在內部加載所有支持的dll文件。但是Oracle.DataAccess.dll要求支持的dll存在於正在執行的應用程序目錄中(在控制檯/ WinForm應用程序的情況下)或者安裝在oracle目錄下(在Web應用程序的情況下)。 Oracle.DataAccess.dll和Oracle.ManagedDataAccess.dll dll之間的區別可以在以下網址找到:https://docs.oracle.com/database/121/ODPNT/intro003.htm#ODPNT131

+0

謝謝!我一直在掙扎幾天! 另外,ManagedDataAccess不處理UDT – Madagaga