2011-12-22 19 views
8

Tôi gặp lỗi khi cố gắng kết nối với cơ sở dữ liệu Oracle 10g từ xa từ ứng dụng C# 2008 Express Edition. Tôi đang cố gắng sử dụng một cách tiếp cận tối giản, không xâm nhập để phát triển với một cái nhìn để triển khai ClickOnce đến các máy trạm của người dùng.Lỗi khi cố gắng kết nối với cơ sở dữ liệu Oracle 10g từ chương trình C# sử dụng cấu hình thiết lập tối thiểu

Đối trên, chúng tôi đã điều tra các tài liệu sau (giữa những người khác ..) -

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#

Khi xem lỗi tôi đã gặp phải, tôi đã tạo một ứng dụng thử nghiệm đơn giản. bao gồm một trang đơn (wpf) chỉ với một nút. Trong nhấp sự kiện của nút tôi cố gắng để tạo ra một kết nối đến một cơ sở dữ liệu 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(); 
     } 
    } 
} 

Tiếp nối thông tin trong các bài viết ở trên tôi đã chắc chắn rằng các DLL sau của là trong tôi thư mục "bin" -

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

(tên cuối cùng trong tuyệt vọng ...) và đã tham chiếu 'Oracle.DataAccess.dll'.

Các thông báo lỗi (tại 'catch (OracleException dbEx)') là -

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

Bên cạnh đó, đây là báo cáo -

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

Tôi giả định từ NullReferenceException trong nguồn dữ liệu mà vấn đề nằm trong một trong những dlls '(?) như tôi' mới 'OracleConnection ở trên trước khi cố gắng tham khảo nó.

Ngoài ra, việc thực thi mã sẽ nhảy 'catch (NullReferenceException nullExcept)' và đi thẳng đến bắt OracleException.

Xin lỗi vì đã đánh bạc nhưng hy vọng điều này có ý nghĩa? Bất kỳ trợ giúp/lời khuyên nào được đánh giá cao!

+0

Can bạn ping 'myServer'? bạn đã thử kết nối thông qua sqlplus? – V4Vendetta

+0

Bạn có thể tnsping 'myOracleDb'? – Shai

+0

'NullReferenceException' không phải là nguyên nhân của sự cố. Nó xảy ra khi bạn kiểm tra ngoại lệ trong VisualStudio. Đó là một tạo phẩm gỡ lỗi và có thể bỏ qua. Thật không may, ngoại lệ thực sự dường như không chứa thông báo lỗi nào. Hay bạn đã bỏ qua nó ở đâu đó? – Codo

Trả lời

0

Đảm bảo ODAC được thiết lập đúng cách. Tôi sẽ đề nghị sử dụng TNSNAMES (bạn không nên có tất cả thông tin đó trong một chuỗi kết nối imo). Xem phần TNSNAMES setup của tài liệu này (11.2).Cũng xem phần dưới cho kết nối phổ biến vấn đề

Khi đã xong, nó phải là dễ dàng như đặt chuỗi kết nối của bạn trong phần cài đặt tài sản của dự án của bạn và thực hiện:

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

Trong ví dụ của bạn, oraConnect bạn hasn đã được instantiated (bạn chỉ có "OracleConnection oraConnect"), do đó, "mới OracleConnection" một phần mà không kết quả trong một ngoại lệ tham chiếu null (nếu tôi hiểu lời giải thích của bạn về nơi nó phá vỡ anyway). Debugger trong VS cũng cần trợ giúp ở đây;)

EDIT: Bạn có thể muốn thiết lập một ứng dụng bảng điều khiển thử nghiệm đơn giản chỉ với kết nối mở/đóng. Điều này có thể loại bỏ bất kỳ tiếng ồn nào khác ngoài việc thiết lập ODAC của bạn đúng cách. Giống như (thiết lập chưa được kiểm tra, giả TNSNAMES):

sử dụng ...

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

Thử chạy đó và báo cáo những gì trở lại từ giao diện điều khiển.

+0

'oraConnect' đã được khởi tạo. Xem từ khóa 'mới' trong' sử dụng (oraConnect = new OracleConnection ... '. – Codo

+0

không rõ ràng ở đâu đây không chính xác từ OP – tbone

1

Điều đó đã xảy ra với tôi.

Sau một chút voodoo, tôi đã xóa khóa này khỏi sổ đăng ký của mình: HKEY_CURRENT_USER\Software\ORACLE và mọi thứ hoạt động tốt trở lại.

2

OK, rất muộn nhận lại điều này mà nhiều lời xin lỗi!

Trong thời gian chuyển tiếp, DB của chúng tôi đã được nâng cấp và thay đổi trong danh sách dll để bao gồm (!) -

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

từ phiên bản '10', vẫn không thành công, tôi đã chỉnh sửa App.xaml (sau một tìm kiếm mở rộng tại đây và trên 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> 

bindingRedirect đã thực hiện thủ thuật!

của dll dường như cực kỳ phụ thuộc vào số phiên bản tương thích

Wish tôi có thể nói rằng tôi thực sự hiểu cách này hoạt động nhưng nó và bây giờ tôi có các kết nối làm việc ...

+1

_Dll của dường như cực kỳ phụ thuộc vào số phiên bản tương thích_ Điều này. Oracle là không có gì nếu không Cực kỳ nhạy cảm, và tôi đã có toàn bộ máy chủ bảo lãnh trên không có gì nhiều hơn một phiên bản XX1/XX2 không phù hợp.Đó sẽ là gợi ý gỡ lỗi của tôi, và tôi vui vì điều này đã được giải quyết. Bạn nên chấp nhận câu trả lời của riêng bạn để những người khác có thể tìm thấy nó. –

Các vấn đề liên quan