Nhà cung cấp không tương thích với phiên bản máy khách của Oracle


157

Tôi đang cố gắng sử dụng Máy khách tức thời Oracle ODP.NET 11g (11.1.0.6.20) trong dự án ASP.net của tôi với tư cách là Nhà cung cấp dữ liệu nhưng khi tôi chạy trang aspx tôi nhận được " Nhà cung cấp không tương thích với phiên bản của máy khách Oracle "thông báo lỗi. Bất kỳ trợ giúp sẽ được đánh giá cao.

Tôi đã tham khảo Nhà cung cấp dữ liệu trong Visual Studio 2005 và mã phía sau trông như thế này:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

Lỗi cho trang trông như thế này:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

Câu trả lời:


91

Tôi đã xem xét vấn đề này hơn nữa và bạn chỉ cần lấy tất cả các DLL thích hợp từ cùng một phiên bản tải xuống của ODP.Net và đặt chúng vào cùng thư mục với tệp exe của bạn, vì ODP.Net rất khó xử về việc không trộn lẫn số phiên bản.

Tôi đã giải thích cách thực hiện việc này tại đây: http://splinter.com.au/USE-the-new-odpnet-to-access-oracle-from-c Đây là ý chính của nó:

  • Tải xuống ODP.Net
  • Giải nén tập tin
  • Giải nén tất cả các JAR trong đó
  • Lấy những dll này vừa được giải nén:
    • oci.dll (được đổi tên từ 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (được đổi tên từ 'ociw32.dll.dbl')
  • Đặt tất cả các DLL trong cùng một thư mục với C # Executable của bạn

4
Giải pháp của bạn đã làm việc cho tôi - tìm thấy bài đăng trên blog của bạn trước khi tôi tìm thấy bài viết này. Bạn là người đàn ông. Cảm ơn! :-) Ngoài ra, bằng cách sử dụng phiên bản ODAC mới nhất, tôi không cần phải giải nén bất kỳ tệp JAR nào ... các tệp dll được đặt trong các thư mục khác nhau trong nhà tiên tri của tôi. Một tìm kiếm cửa sổ đơn giản bật chúng lên rất nhanh.
Pandincus

10
Ngoài ra, tôi đã sử dụng phiên bản ODAC mới nhất (11.2.0.1.2) trên máy phát triển của mình và các tệp duy nhất tôi cần là: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Như Chris chỉ ra, HÃY ĐẢM BẢO NHỮNG NGƯỜI NÀO CÙNG NHỮNG NGƯỜI CÙNG NHƯ VẬY. ;-)
Pandincus

1
Âm thanh như phiên bản mới hơn giúp tìm dll dễ dàng hơn. Tuyệt quá! Bây giờ, bao lâu cho đến khi nhà tiên tri cuộn chúng thành một dll đơn giản ...
Chris

Chiến lược của Chris và bộ thư viện của Pandincus đã làm việc cho tôi. Tôi đang gọi máy khách oracle thông qua PowerShell, vì vậy tôi đặt thư viện được đặt trong thư mục thực thi PowerShell.
quillbreaker

1
Bạn có thể nên sử dụng trình điều khiển được quản lý C # trong những ngày này nếu bạn có thể :)
Chris

47

Bạn nên "bỏ qua" tất cả các cuộc nói chuyện x86 / x64 tại đây để bắt đầu và thay vào đó hãy thử Trình điều khiển được quản lý ODP.NET (nếu bạn đang sử dụng .Net v4 +):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Oracle ODP.net Được quản lý so với Trình điều khiển không được quản lý

Tránh tất cả những gì "không được quản lý" những gì DLL vấn đề kiến ​​trúc! : D (về thời gian Oracle).

Gói NuGet (cũng hoạt động trong 11g):

nhập mô tả hình ảnh ở đây

Phương pháp cũ / thủ công:

Để biết thông tin về cách chuyển đổi sang sử dụng các thư viện được quản lý :

  • Đầu tiên, đây là một so sánh mã tuyệt vời của quản lý so với không được quản lý : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htmlm#ODPNT148
  • Đảm bảo bạn đã tải xuống phiên bản ODP.NET, Managed Driver Xcopy
  • Từ tệp zip đã tải xuống, sao chép và dán vào thư mục dự án của bạn:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Thêm một tham chiếu đến Oracle.ManagedDataAccess.dll
  • Đảm bảo exe của bạn được phát hành (được thêm vào Thư mục ứng dụng trong VS2010) với cả hai dll

3
Tin tốt của nó là cuối cùng Oracle cũng có một trình điều khiển được quản lý hoàn toàn. Nắm bắt khoảng 100mb dll đó là một gánh nặng thực sự.
Jafin

1
trình điều khiển được quản lý hoạt động rất tốt đối với tôi - Tôi không gặp vấn đề gì khi chuyển sang nó / bạn có thể đặt các dự án của mình trở lại AnyCPU, v.v. và nó hoạt động rất tốt :)
Tod Thomson

5
Để mọi người đều biết, trong khi Nhà cung cấp được quản lý tốt, nó thiếu rất nhiều tính năng mà nhà cung cấp đầy đủ cho phép. Cụ thể, Oracle được xây dựng trong mã hóa.
Justin Skiles

1
Tài liệu của Oracle có xu hướng "phân tán" để nói rằng ít nhất. Đây là một liên kết tốt về một số phương pháp không được hỗ trợ . Ngoài ra, trình điều khiển đi kèm với một trong readmeđó nêu ra một số hạn chế.
Justin Skiles

2
Sử dụng trình điều khiển được quản lý là giải pháp cuối cùng! Tôi có một cơn ác mộng mỗi khi tôi nghĩ rằng tất cả thời gian dành cho tôi khi tôi có một kiểu không phù hợp
ettore ct

35

Tôi chỉ cài đặt Trình cung cấp dữ liệu Oracle cho .NET 2.0 (11.1.0.6.20) và tôi không cài đặt Máy khách ngay lập tức của Oracle (11.1.0.6.0) .

Tôi chỉ cần cài đặt nó và lỗi biến mất!


3
Bạn có thể chỉ cần sao chép 4 DLL máy khách tức thời vào cùng thư mục với EXE của bạn, thay vì cài đặt máy khách không? (các tệp này: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris

2
@Chris: Vâng, bạn có thể. Tuy nhiên, theo kinh nghiệm của tôi, bạn cần oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll và oracle.dataaccess.dll
Pakman

Cách khác đối với tôi - Tôi đã cài đặt ứng dụng khách, nhưng không phải nhà cung cấp
Ev.

33

Điều này có thể được gây ra bằng cách chạy thời gian chạy .NET 64 bit đối với máy khách Oracle 32 bit. Điều này có thể xảy ra nếu máy chủ của bạn, bạn đang chạy ứng dụng trên 64 bit. Nó sẽ chạy ứng dụng .NET với thời gian chạy 64 bit. Bạn có thể đặt cờ CPU trên dự án của mình trong VS để chạy trong thời gian chạy 32 bit.


Chỉ cần chạy vào cái này Làm việc trong một ứng dụng thử nghiệm (32 bit), sau đó rơi vào IIS. Thay vì yêu cầu tất cả các hội đồng liên quan là 32 bit, tôi đã đổi thành AppPool 32 bit.
anton.burger

22

Chúng ta hãy làm một số loại tóm tắt:

Thông báo lỗi "Nhà cung cấp không tương thích với phiên bản máy khách của Oracle" có thể do một số lý do.

  • Bạn chưa cài đặt Máy khách Oracle. Trong trường hợp này, thông báo lỗi thực sự gây hiểu nhầm.

    Nhà cung cấp dữ liệu Oracle cho .NET (ODP.NET, tức là tệp Oracle.DataAccess.dll) không được bao gồm trong Oracle Instant Client, nó phải được cài đặt riêng (tải xuống từ Thành phần truy cập dữ liệu Oracle 32 bit (ODAC) hoặc Thành phần truy cập dữ liệu Oracle 64 bit ( ODAC) Tải xuống ) hoặc bạn phải chọn tùy chọn trong Trình cài đặt chung của Oracle (OUI).

    Lưu ý, khi cài đặt Nhà cung cấp dữ liệu Oracle> = 12.1, thì nhà cung cấp đó không được đăng ký tự động vào GAC. Bạn phải đăng ký thủ công nếu cần, xem Oracle Doc 2272241.1 .

  • Phiên bản ODP.NET không khớp với phiên bản cài đặt của Máy khách Oracle. Bạn phải kiểm tra ngay cả số phiên bản nhỏ! Ví dụ, Oracle.DataAccess.dllPhiên bản 4.112.3.0 không tương thích với Oracle Client 11.2.0.4 . Kiểm tra các phiên bản của ODP.NET và Oracle Client một cách cẩn thận. Bạn có thể sử dụng sigcheck trên oraociei*.dllvà / hoặc OraOps*w.dllđể có phiên bản Oracle Client.

    Hãy nhận biết các chương trình đánh số khác nhau. Phiên bản tệp 4.112.3.0 phương tiện: .NET Framework Version 4, Oracle phát hành 11.2.0.3.x .

    Có phiên bản ODP.NET "1.x", "2.x" và "4.x". Những con số này có liên quan đến các phiên bản Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 và 4.0.30319. Phiên bản "1.x" đã có sẵn cho đến Oracle Client 11.1. Phiên bản "4.x" được giới thiệu với Oracle Client 11.2

  • Kiến trúc (32 bit hoặc 64 bit) của ODP.NET không khớp với kiến ​​trúc ứng dụng của bạn. Một ứng dụng 32 bit chỉ hoạt động với Oracle Client / ODP.NET 32 bit tương ứng một ứng dụng 64 bit yêu cầu Oracle Client / ODP.NET 64 bit. (Trừ khi bạn sử dụng Trình điều khiển được quản lý ODP.NET )

  • Phiên bản .NET Framework không khớp. Ví dụ: nếu bạn biên dịch ứng dụng của mình với Target .NET Framework 2.0 thì bạn không thể sử dụng ODP.NET phiên bản 4.x. Phiên bản đích của .NET Framework phải bằng hoặc cao hơn phiên bản ODP.NET.

  • Phiên bản Oracle.DataAccess.dlltrên máy phát triển của bạn (tức là phiên bản được tải trong khi biên dịch) cao hơn phiên bản trên máy đích.

  • Xin lưu ý rằng Oracle.DataAccess.dllcó thể được tải từ GAC , theo mặc định sẽ được ưu tiên hơn bất kỳ tệp nào được cung cấp cục bộ.

Các giải pháp

  • Xem xét để sử dụng Trình điều khiển được quản lý ODP.NET, có thể tải xuống từ trang Oracle: Tải xuống các thành phần truy cập dữ liệu Oracle (ODAC) 64 bit . Ở đó bạn chỉ phải sao chép Oracle.ManagedDataAccess.dlltập tin vào thư mục ứng dụng của bạn, không có gì khác được yêu cầu. Nó hoạt động cho cả 32 bit và 64 bit.

  • Trong của bạn *.csproj, tôn trọng. *.vbprojchỉnh sửa tham chiếu của bạn đến ODP.NET như thế này:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

    Các thuộc tính thích Version=...hoặc processorArchitecture=...không bắt buộc. Ứng dụng của bạn sẽ tải chính xác Oracle.DataAccess.dlltùy thuộc vào kiến ​​trúc đã chọn và khung .NET đích (với điều kiện là nó được cài đặt đúng cách) -> không được xác minh 100%

  • Trong trường hợp bạn không biết phiên bản Máy khách Oracle trên máy mục tiêu (ví dụ: đó có thể là máy của khách hàng của bạn): Truy cập trang tải xuống được đề cập ở trên và tải xuống phiên bản XCopy ít nhất của Cấu phần truy cập dữ liệu Oracle. Giải nén zip và sao chép chỉ Oracle.DataAccess.dlltập tin vào máy cục bộ của bạn. Trong dự án VS của bạn, hãy tham chiếu đến DLL này (rất có thể đã lỗi thời). Phiên bản của DLL này là phiên bản ít nhất của ODP.NET, ứng dụng của bạn sẽ hoạt động. Khi bạn chạy ứng dụng của mình thì Chính sách nhà xuất bản trong GAC sẽ chuyển hướng đến phiên bản thực sự được cài đặt.

  • Tôi không nghĩ rằng đó là một cách tiếp cận thông minh để lấy một DLL duy nhất và sao chép chúng vào các thư mục nhất định. Nó có thể hoạt động trên máy "trần trụi" nhưng nếu máy mục tiêu của bạn đã cài đặt bất kỳ sản phẩm Oracle nào thì có nguy cơ cao cho phiên bản không khớp. Gỡ cài đặt mọi sản phẩm Oracle khỏi máy của bạn và thực hiện cài đặt mới. Hãy xem Làm thế nào để gỡ cài đặt / loại bỏ hoàn toàn Oracle 11g (máy khách)? Nó để có được một máy thực sự sạch sẽ.

  • Trong trường hợp bạn phải làm việc với các ứng dụng 32 bit và 64 bit cùng một lúc, hãy làm theo hướng dẫn này để cài đặt cả hai phiên bản trên một máy:

Giả định: Trang chủ Oracle được gọi OraClient11g_home1, Phiên bản máy khách là 11gR2.

  • Tùy chọn loại bỏ bất kỳ máy khách Oracle đã cài đặt

  • Tải xuống và cài đặt Máy khách Oracle x86, ví dụ vào C:\Oracle\11.2\Client_x86

  • Tải xuống và cài đặt Máy khách Oracle x64 vào thư mục khác, ví dụ như C:\Oracle\11.2\Client_x64

  • Thông thường, mở công cụ dòng lệnh, đi đến thư mục% WINDIR% \ System32 C:\Windows\System32và tạo một liên kết tượng trưng ora112đến thư mục C:\Oracle\11.2\Client_x64(xem bên dưới)

  • Thông thường, thay đổi thư mục% WINDIR% \ SysWOW64 C:\Windows\SysWOW64và tạo một liên kết tượng trưng ora112đến thư mục C:\Oracle\11.2\Client_x86, (xem bên dưới)

  • Sửa đổi PATHbiến môi trường, thay thế tất cả các mục như C:\Oracle\11.2\Client_x86C:\Oracle\11.2\Client_x64bằng C:\Windows\System32\ora112, tương ứng \binthư mục con của chúng . Lưu ý: C:\Windows\SysWOW64\ora112không được ở trong môi trường PATH.

  • Nếu cần, đặt ORACLE_HOMEbiến môi trường yor thànhC:\Windows\System32\ora112

  • Mở Registry Editor của bạn. Đặt giá trị đăng ký HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEthànhC:\Windows\System32\ora112

  • Đặt giá trị Registry HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEthành C:\Windows\System32\ora112(không C:\Windows\SysWOW64\ora112)

  • Bạn xong việc rồi! Bây giờ bạn có thể sử dụng máy khách Oracle x86 và x64 liền mạch với nhau, tức là một ứng dụng x86 sẽ tải các thư viện x86, một ứng dụng x64 tải các thư viện x64 mà không cần sửa đổi gì thêm trên hệ thống của bạn.

Các lệnh tạo liên kết tượng trưng:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

Một số lưu ý:

  • Cả hai liên kết tượng trưng phải có cùng tên, ví dụ ora112.

  • Trong trường hợp bạn muốn cài đặt ODP.NET theo cách thủ công sau đó, hãy cẩn thận để chọn các thư mục phù hợp để cài đặt.

  • Mặc dù thư mục tên của chúng C:\Windows\System32chứa các thư viện x64, trong khi đó C:\Windows\SysWOW64chứa các thư viện x86 (32 bit). Đừng nhầm lẫn.

  • Có thể đó là một lựa chọn khôn ngoan để đặt TNS_ADMINbiến môi trường của bạn ( TNS_ADMINví dụ: các mục trong Registry) thành một vị trí chung TNS_ADMIN=C:\Oracle\Common\network.


IMO này có nhiều kiến ​​thức để lấy đi hơn câu trả lời thực tế. Vậy nếu tôi có ứng dụng x86 cho .net 4 và phiên bản cơ sở dữ liệu là 9i, thì người dùng sẽ cần phiên bản máy khách nào nếu họ có Windows 32 hoặc 64 bit? Oracle cho biết bất kỳ phiên bản máy khách nào cũng tương thích với bất kỳ phiên bản db nào. Có phải câu trả lời với người dùng 32 bit là cài đặt phiên bản 32 bit và người dùng 64 bit cài đặt phiên bản 64 bit và sử dụng Trình điều khiển được quản lý ODP.NET để quyết định hệ điều hành nào đang nói đến?
Sáng

1
Khi bạn sử dụng Trình điều khiển được quản lý ODP.NET thì không cần cài đặt bất kỳ máy khách Oracle nào - đó là lợi thế chính của nó. Nó hoạt động với cả hai ứng dụng x86 và x64. Không có "Trình điều khiển được quản lý ODP.NET", ứng dụng x86 cũng yêu cầu Máy khách Oracle x86 (tức là 32 bit), bất kể kiến ​​trúc máy chủ cơ sở dữ liệu là gì.
Wernfried Domscheit

Tôi vừa chạy vào "Microsoft Visual C ++ 2010 Redistributable cần được cài đặt" - bạn nên thêm nó vào bản tóm tắt của mình.
Jay Sullivan

1
Tôi không nghĩ lỗi này có liên quan hoặc do Oracle hoặc ODP.NET gây ra
Wernfried Domscheit

Nó hoạt động với tôi, tôi cài đặt Oracle.DataAccess.dlltừ gói nuget Oracle.DataAccess.x86và Phiên bản dll của nó là 2.112.1.0vậy, vì vậy tôi khớp cài đặt Oracle Client với phiên bản Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) TẠI ĐÂY rồi vấn đề được giải quyết!
yu yang Jian

6

Sau vài giờ khắc phục sự cố, tôi thấy sự cố này xảy ra do có Oracle.DataAccess.dll (v4.0) trong thư mục bin dự án của mình, nhưng thời gian chạy cũng tải Oracle.DataAccess.dll (v2.x) từ GAC. Loại bỏ và làm lại mục nhập Oracle.DataAccess trong tài liệu tham khảo dự án đã giải quyết vấn đề cho tôi.

Các tập tin khác được đề cập ở đây dường như không cần thiết trong tình huống của tôi.

CẬP NHẬT

Nguyên nhân sâu xa của lỗi "Nhà cung cấp không tương thích với phiên bản máy khách của Oracle" là (nói chung) rằng hội đồng được quản lý đang cố tải các thư viện không được quản lý không khớp với các phiên bản. Dường như bạn có thể buộc trình điều khiển Oracle sử dụng các thư viện chính xác bằng cách chỉ định đường dẫn thư viện trong web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>

Cảm ơn! Giải pháp của bạn cho tôi ý tưởng hoạt động sau 2 ngày (Tôi có Visual Studio 2010 Net 4, máy khách Oracle 10g) ... Tôi thấy GAC và tất nhiên tôi đã cài đặt 3 bản xác minh của Oracle.DataAccess.dll, tôi đã bỏ qua tất cả (và xóa các khóa machine.config không hợp lệ trong "DbProviderFactories") và chỉ cài đặt lại ODAC1120320 x64. Và nó hoạt động.
Hernaldo Gonzalez

5

cài đặt ODP.Net trên máy đích và nó sẽ giải quyết vấn đề ... sao chép dll có vẻ không phải là một ý tưởng hay ...


5

Đối với Oracle 11g (11.1.0.7.20) tôi đã phải thêm các dll sau đây cùng với exe của tôi để làm việc.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (khá lớn gần 30mb)
  4. Oracle.DataAccess.dll

Bạn muốn nói 130 MB
Elmue

2

Dường như với tôi rằng mặc dù bạn có ODP với Máy khách Oracle Istant, nhưng ODP có thể đang cố gắng sử dụng Máy khách Oracle thực tế để thay thế. Bạn có cài đặt máy khách Oracle tiêu chuẩn trên máy không? Tôi nhớ lại rằng Oracle khá kén chọn khi nói đến nhiều khách hàng trên cùng một máy.


2

Tôi cũng có chính xác vấn đề đấy. Tôi đã xóa (và quên rằng tôi đã xóa) oraociei11.dll sau khi biên dịch ứng dụng. Và nó đã đưa ra lỗi này trong khi cố gắng thực hiện. Vì vậy, khi nó không thể tìm thấy dll mà oraociei11.dll, nó sẽ hiển thị lỗi này. Có thể có những trường hợp khác khi nó đưa ra lỗi này, nhưng đây dường như là một trong số đó.


2

Đồng thời tìm nhóm ứng dụng IIS Kích hoạt cờ 32 bit đúng hoặc sai, khi bạn thấy thông báo này, một số diễn đàn oracle đã hướng dẫn tôi cho điều này!


2

Tôi có cùng một vấn đề nhưng trong trường hợp của tôi, tôi không thể sao chép các dll vào thư mục bin, sau đó tôi chỉ 'rebind' phiên bản lắp ráp.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>    
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
        <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

2

Đây là những gì tôi đã làm để giải quyết vấn đề này tồn tại trong 3 giờ dài:

  1. Trong nhà của Oracle nằm ở C:\oracle\product\11.2.0tôi có một thư mục được gọi là client_1nơi tôi đã cài đặt ODP.NETcác bit trước đó cho Windows 64 bit.

  2. Sau này trong khi cố gắng gỡ lỗi ứng dụng ASP.NET Web API của tôi với Visual Studio 2012, tôi liên tục nhận được thông báo lỗi này: Nhà cung cấp không tương thích với phiên bản máy khách của Oracle .

  3. Tìm kiếm trên Google tôi thấy rằng điều này đã xảy ra vì tôi đang sử dụng ODP.NET64 bit. Sau đó, tôi lấy ODP.NETWindows 32 bit và cài đặt nó nhưng tôi vẫn nhận được thông báo lỗi tương tự.

  4. GIẢI PHÁP: đã xóa thư mục client_1và cài đặt lại ODP.NET32 bit. Phần nào trình cài đặt đã trộn các bit từ phiên bản 64 bit với phiên bản 32 bit. Đi nào ...

  5. Bây giờ tôi lại vui vẻ và tôi có thể mở một cái mới OracleConnection. CUỐI CÙNG! :)


2

Đối với bất cứ ai vẫn gặp phải vấn đề này: dựa trên bài viết này

http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compiverse-with.html

Tôi phát hiện ra rằng máy chủ của tôi bị thiếu Thư viện thời gian chạy trực quan Microsoft C ++ - Tôi đã có nó trên máy dev của mình vì đã cài đặt Visual Studio. Tôi đã tải xuống và cài đặt phiên bản mới nhất (hiện tại) của thư viện từ đây:

http://www.microsoft.com/en-us/doad/details.aspx?id=13523

Chạy cài đặt và cuộc gọi tiên tri từ C # đã thực hiện!


1
Anh bạn .... Oracle .... chúng ta có thể thảo luận một chút không? Đến đây, trong góc. Nghe này, tôi đã dành cả ngày để tìm hiểu ý nghĩa của "nhà cung cấp không tương thích" nghĩa là gì, chỉ để sau đó phát hiện ra rằng vì một số phụ thuộc cài đặt không được đáp ứng. Xin vui lòng - không - Tôi yêu cầu bạn thực hiện kiểm tra trình cài đặt của mình cho các phụ thuộc này tại thời điểm cài đặt và cảnh báo người dùng nếu nó không được đáp ứng. Cảm ơn.
Jay Sullivan

3
Nhân tiện, tôi đã phải quay lại câu hỏi stackoverflow này nhiều lần và một câu trả lời khác nhau áp dụng cho tôi mỗi lần. Thật là một sự lãng phí thời gian và tiền bạc này đã gây ra.
Jay Sullivan

2

Phiên bản TLDR:

  • Sử dụng nhà cung cấp được quản lý 100c 100% thay thế.
  • Nếu bạn phải sử dụng nhà cung cấp cũ, bạn cần trỏ Oracle.DataAccess.dll đến các DLL của Oracle Client không được quản lý là phiên bản chính xác. Nếu bạn có nhiều Máy khách Oracle được cài đặt trên máy của mình, có thể đơn giản như bao gồm biến cấu hình "DLLPath" (xem bên dưới) trong cấu hình ứng dụng của bạn, nhưng bạn cũng có thể cần phải cài đặt máy khách oracle mới để trỏ đến.

Phiên bản đầy đủ:

Trước tiên, hãy đảm bảo rằng chúng tôi hiểu các thành phần của nhà cung cấp cũ không được quản lý (không phải nhà cung cấp mới được quản lý 100% 100%). Nó được tạo thành từ hai mảnh:

  1. thành phần .net được quản lý - Oracle.DataAccess.dll
  2. khách hàng không được quản lý (non-.net)

Nói một cách đơn giản, Oracle.DataAccess.dll gần như chỉ là một trình bao bọc, dịch các hướng dẫn .net thành các hướng dẫn ORACLE-NET cho máy khách không được quản lý.

Điều đó nói rằng, khi bạn tải Oracle.DataAccess, có một thứ tự trong đó nó cố gắng xác định vị trí các máy khách không được quản lý mà nó cần. Từ Tài liệu Oracle :

Oracle.DataAccess.dll tìm kiếm các DLL không được quản lý phụ thuộc (chẳng hạn như Máy khách Oracle) dựa trên thứ tự sau:

1.Directory của ứng dụng hoặc thực thi.

Cài đặt 2.DllPath được chỉ định bởi cấu hình ứng dụng hoặc web.config.

Cài đặt 3.DllPath được chỉ định bởi machine.config.

Cài đặt 4.DllPath được chỉ định bởi Windows Registry.

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ version \ DLLPath

5. Các hướng dẫn được chỉ định bởi biến môi trường Windows PATH.

Vì vậy, trong trường hợp của bạn, ứng dụng của bạn đã tuân theo quy trình này ở trên và tìm thấy một đường dẫn có các dll không được quản lý quá cũ so với tập hợp Oracle.DataAccess.dll mà bạn đang sử dụng.

Nó chỉ có thể là cài đặt Oracle Client duy nhất trên máy đó quá cũ. Nhưng điều này sẽ xuất hiện nếu bạn có nhiều máy khách được cài đặt trên máy và các tệp không được quản lý được tìm thấy đầu tiên trong một bản cài đặt khác nhưng cũ hơn. Nếu sau này, điều đơn giản cần làm là sử dụng biến cấu hình dllPath trong cấu hình của bạn và trỏ nó vào thư mục Oracle Home Bin chính xác:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

Nếu bạn muốn cài đặt một bản sao mới của máy khách, phiên bản xcopy là nhỏ nhất và chứa "ứng dụng khách tức thời" và trỏ DLLPath ở trên đến vị trí mới này. Nhưng bất kỳ cài đặt máy khách oracle sẽ làm việc.

Nhưng nếu bạn muốn tránh tất cả các công cụ phân giải ứng dụng khách không được quản lý này, hãy xem liệu bạn có thể cập nhật ứng dụng của mình để sử dụng nhà cung cấp được quản lý 100% hay không - thực sự chỉ là một hoặc hai hội đồng được quản lý, không phụ thuộc vào các tệp không được quản lý.

Cũng có thể là bạn không tải Oracle.DataAccess.dll mà bạn nghĩ là bạn nếu nó được cài đặt trong cả thư mục bin và GAC của bạn, nhưng tôi nghĩ đó là senario ít có khả năng hơn. Xem quy trình giải quyết lắp ráp để biết thêm thông tin.


1

Người dùng IIS / IWAM có quyền trên thư mục Oracle không? Bạn có thể kết nối với nguồn dữ liệu này bằng một ứng dụng khác, chẳng hạn như Excel hoặc Access không?


1

Chúng tôi có cùng một vấn đề, bởi vì tập hợp Oracle.Data.dll trên chia sẻ mạng đã được cập nhật bởi DBA của chúng tôi. Xóa tham chiếu khỏi dự án và thêm nó một lần nữa giải quyết vấn đề.


1

Chỉ cần hai bước để giải quyết vấn đề này.

  1. đi tới cài đặt trước của nhóm ứng dụng và đặt cờ 'Bật ứng dụng 32 bit' thành True.
  2. Đảm bảo rằng tất cả các DLL trong Bin của bạn là phiên bản 32 bit ...

may mắn nhất.


@ mazhar-abbas, bạn có thể vui lòng. chỉ ra trong đó tôi có thể đặt 'Kích hoạt ứng dụng 32 bit? Có phải trong IIS hoặc Project?
hiFI

1

Tôi đã không đi vào con đường nhận được DLL mới. Chúng tôi đã có một loạt các dự án hiện có hoạt động hoàn toàn tốt và đó chỉ là dự án mới của tôi khiến tôi đau đầu nên tôi quyết định thử một cái gì đó khác.

Dự án của tôi đã sử dụng Internal.dll được phát triển nội bộ phụ thuộc vào Oracle.DataAccess.dll v4.112.3.0. Vì một số lý do, khi xuất bản, Visual Studio luôn được tải lênv4.121.0.0 , mặc dù nó không được chỉ định rõ ràng trong bất kỳ tệp cấu hình nào. Đó là lý do tại sao tôi nhận được một lỗi.

Vì vậy, những gì tôi đã làm là:

  1. Đã sao chép Internal.dll từ một trong những dự án đang chạy thành công vào trang web của tôi /bin(chỉ để ở bên an toàn).
  2. Sao chép Oracle.DataAccess.dll từ một trong những dự án đang chạy thành công vào trang web của tôi /bin.
  3. Thêm tài liệu tham khảo cho cả hai từ trang web của tôi.
  4. Cuối cùng, tham chiếu Oracle.DataAccess xuất hiện myWebSite.csproj, nhưng nó cho thấy phiên bản sai: v4.121.0.0thay vì v4.112.3.0.
  5. Tôi tự thay đổi tham chiếu trong myWebSite.csproj, vì vậy bây giờ nó đọc:

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 

2
Đó là một thực sự ý tưởng tồi để thêm một tham chiếu đến dlls trong một thư mục bin.
Jay Sullivan

1
Các binobjthư mục là các thư mục đầu ra ; đây là nơi dlls đi khi bạn xây dựng dự án của bạn. Bạn sẽ có thể xóa các thư mục này bất cứ lúc nào mà không tạo ra xung đột. Thông thường các thư mục này được bỏ qua trong kiểm soát nguồn. Thực hành tiêu chuẩn là tạo một External Referencesthư mục nơi bạn đặt các dll tham chiếu của mình.
Jay Sullivan

@notfed Có vẻ bạn đúng. Sẽ giữ điều này trong tâm trí của tôi.
Robotron

Như được đặt tên, nó chỉ là một đường dẫn gợi ý cho trình biên dịch, không phải là một tham chiếu bắt buộc. Đầu tiên GAC được tìm kiếm cho Oracle.DataAccess.dll. Nó sẽ hoạt động ngay cả khi bạn xóa HintPathhoàn toàn.
Wernfried Domscheit

1

Tôi gặp phải vấn đề này sau khi tôi cài đặt Công cụ dữ liệu Oracle cho Visual Studio 2015, và sau đó chiến đấu với Oracle trong một giờ tốt. Tôi quyết định thử cài đặt lại máy khách Oracle một lần nữa thay vì sự lộn xộn này với sao chép tệp, thay đổi cấu hình, v.v., và điều đó hiệu quả với tôi.


1

Tôi đã gặp phải một vấn đề tương tự và nguyên nhân sâu xa là GAC có 2 phiên bản oracle.dataaccess tức là v4.0_4.112.2.0 và v4.0_4.112.4.0. Ứng dụng của tôi đã đề cập đến v4.0_4.112.2.0, vì vậy khi tôi xóa v4.0_4.112.4.0 khỏi GAC, nó hoạt động tốt.

Đường dẫn GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

Trước : nhập mô tả hình ảnh ở đây

Sau : nhập mô tả hình ảnh ở đây

Để xóa phiên bản, người ta chỉ cần xóa thư mục tương ứng khỏi GAC.


0

Gần đây tôi đã phải làm việc trên một dự án cũ hơn, nơi giải pháp và tất cả các dự án có chứa được nhắm mục tiêu đến nền tảng x32. Tôi tiếp tục cố gắng sao chép Oracle.DataAccess.dll và tất cả các tệp Oracle được đề xuất khác trên tất cả các vị trí, nhưng mỗi lần nhấn vào tường. Cuối cùng, bóng đèn trong đầu sáng lên (sau 8 giờ :)), và yêu cầu kiểm tra các cụm ODAC đã cài đặt và nền tảng của chúng. Tôi đã cài đặt tất cả các máy khách ODAC 64 bit (x64) nhưng không phải là máy khách 32 bit (x32). Đã cài đặt ODAC 32 bit và sự cố đã biến mất.

Cách kiểm tra phiên bản ODAC đã cài đặt: Xem trong thư mục C: \ Windows \ assembly. Thuộc tính "Kiến trúc bộ xử lý" sẽ thông báo cho nền tảng của ODAC được cài đặt.

Tám giờ là một thời gian dài để bóng đèn sáng lên. Không có gì ngạc nhiên khi tôi luôn phải đi làm trong công việc :).


Lưu ý, C:\Windows\assemblieschỉ hiển thị các hội đồng lên đến .NET framework phiên bản 2.0. Phiên bản 3.x / 4.x không được hiển thị, xem stackoverflow.com/questions/28213105/ trên
Wernfried Domscheit

0

Giải pháp của Chris cũng làm việc cho tôi. Tuy nhiên, tôi đã nhận được một thông báo lỗi theo sau:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Rõ ràng, bằng tiếng nước ngoài của Oraclish, điều đó có nghĩa là chương trình của bạn đang nhắm mục tiêu tất cả các nền tảng hoặc máy 32 bit. Chỉ cần thay đổi nền tảng mục tiêu của bạn trong Project Properties thành 64-bit và hy vọng điều tốt nhất.


3
Đó thực sự là .NETish, không phải Oraclish
Jay Sullivan

0

Tôi gặp vấn đề tương tự với Oracle.DataAccess.dll v4.121.2.0. với cài đặt 2- nhà (phiên bản 32 và 64 bit). Phiên bản workerd 32 bit, phiên bản 64 bit thì không.

Trong trường hợp của tôi (sau 2 ngày thử) tôi thấy rằng vấn đề là quyền trên phiên bản 64 bit. Nhiều thư mục trong phiên bản đó đã bị ghi đè độc quyền trong đó vai trò "Người dùng được xác thực" không có quyền truy cập "Đọc", được đặt theo mặc định trên thư mục mẹ. Các thư mục con đó bao gồm "bin", "mạng / quản trị viên", "nls", "oracore", "RDBMS" và có thể các thư mục khác. Tôi đã tìm thấy chúng bằng cách lọc ra kết quả "ACCESS DENIED" trong tiện ích "Process Monitor" (Procmon.exe) từ sysiternals. Khi các quyền được kế thừa từ thư mục mẹ đến các thư mục con con đó, mọi thứ bắt đầu hoạt động.

Tôi không có gì để ghi đè các quyền trên toàn bộ nhà tiên tri vì vậy tôi đã thực hiện chúng một thư mục cùng một lúc, nhưng tôi đoán nếu bạn không lo lắng về bảo mật thì bạn có thể đặt lại nó trên toàn bộ thư mục nhà tiên tri tương ứng.



-3

Rất nhiều câu trả lời lý thuyết ở đây, nhưng ở đây có một ví dụ hoạt động với mã mà bạn có thể sao chép và dán và kiểm tra ngay lập tức:

  1. Tôi đã cài đặt cơ sở dữ liệu Oracle Express OracleXE112 đi kèm với một số bảng demo được cài đặt sẵn.
  2. Khi bạn khởi động trình cài đặt, bạn được yêu cầu nhập mật khẩu . Tôi đã nhập "xxx" làm mật khẩu. (không được sử dụng trong sản xuất)
  3. Máy chủ của tôi chạy trên máy 192.168.1.158
  4. Trên máy chủ, bạn phải cho phép truy cập rõ ràng quá trình TNSLSNR.exe trong Tường lửa Windows . Quá trình này lắng nghe trên cổng 1521. Nếu bạn gặp lỗi hết thời gian từ mã bên dưới, hãy kiểm tra tường lửa của bạn.
  5. TÙY CHỌN A: Đối với C # (.NET2 hoặc .NET4), bạn có thể tải xuống ODAC11 , từ đó bạn phải thêm Oracle.DataAccess.dll vào dự án của mình. Ngoài ra, DLL này phụ thuộc vào: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Các DLL này phải nằm trong cùng thư mục với EXE hoặc bạn phải chỉ định đường dẫn DLL trong : HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Trên máy 64 bit, ghi thêm vàoHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. TÙY CHỌN B: Nếu bạn đã tải xuống ODAC12, bạn cần Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), Oraons.dll, msvcr100.dll. Đường dẫn đăng ký làHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. TÙY CHỌN C: Nếu bạn không muốn DLL lớn hơn 100 MB, bạn nên tải xuống ODP.NET_Managed12.xxxxxxxx.zip trong đó bạn tìm thấy Oracle.ManagedDataAccess.dllchỉ có 4 MB và là một DLL được quản lý thuần túy hoạt động trong các quy trình 32 bit và 64 bit cũng như và phụ thuộc vào không có DLL nào khác và không yêu cầu bất kỳ mục đăng ký nào.
  8. Mã C # sau hoạt động với tôi mà không có bất kỳ cấu hình nào ở phía máy chủ (chỉ cài đặt mặc định):
sử dụng Oracle.DataAccess.Client;
hoặc là
sử dụng Oracle.ManagedDataAccess.Client;

....

chuỗi oradb = "Nguồn dữ liệu = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "Id người dùng = HỆ THỐNG; Mật khẩu = xxx;";

bằng cách sử dụng (OracleConnection Conn = new OracleConnection (oradb)) 
{
    Conn.Open ();
    bằng cách sử dụng (OracleCommand cmd = new OracleCommand ())
    {
        cmd. Kết nối = liên kết;
        cmd.CommandText = "chọn TABLESPACE_NAME từ DBA_DATA_FILES";

        bằng cách sử dụng (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

Một quá mức cần thiết để cài đặt toàn bộ máy chủ cơ sở dữ liệu Oracle khi bạn chỉ cần một máy khách đang chạy.
Wernfried Domscheit

Bạn trả lời là kém. Không cần sao chép bất kỳ thư mục ứng dụng nào của Oracle vào thư mục ứng dụng vì theo mặc định, bạn tìm thấy chúng thông qua ‰ PATH% (trừ khi bạn tự sửa đổi nó) Gợi ý đăng ký chỉ áp dụng cho.version 4.x và chỉ hoạt động cho Máy khách Oracle 32 bit. Tuy nhiên, sự không phù hợp 32 bit so với 64 bit là chủ đề chính của câu hỏi này
Wernfried Domscheit

Bạn bình luận cho thấy rằng bạn đã không đọc câu trả lời của tôi. Nếu tôi muốn viết một ứng dụng giao tiếp với máy chủ Oracle thì không cần phải cài đặt bất cứ thứ gì từ Oracle. Tôi chỉ sử dụng DLL đã đề cập ở trên và phân phối nó với ứng dụng của tôi. Vì vậy, sẽ không có gì trong biến PATH trên máy của người dùng cuối. Nhân tiện, việc sử dụng biến PATH (xuất phát từ thời đại DOS cũ từ năm 1980) rất không được dùng trong phần mềm hiện đại. Câu trả lời của tôi khuyến nghị TÙY CHỌN C không cần bất kỳ đường dẫn đăng ký nào và không phụ thuộc vào 32 hoặc 64 bit. Tôi chỉ đề cập đến TÙY CHỌN A và B để hoàn thiện.
Elmue

Tôi nghĩ rằng nếu không cài đặt% PATH% thích hợp thì Windows của bạn sẽ không hoạt động - ngay cả trong phiên bản 10. Tôi đã đề cập trong câu trả lời của mình rằng việc sao chép thủ công bất kỳ Oracle dll nào với ứng dụng của bạn là không thông minh. Tôi không biết mã nguồn của các dll của nhưng có thể có nhiều hơn phụ thuộc vào phía khách hàng của bạn mà bạn không nhìn thấy, ví dụ như kích hoạt bởi các thiết lập ngôn ngữ, các bộ ký tự, múi giờ, vv Khi tôi thực hiện một dấu vết với Oracle.DataAccess.dllthì tải chương trình trong tổng số 35 DLL của Oracle! Tốt hơn là thực hiện cài đặt bình thường của Máy khách Oracle - trừ khi bạn sử dụng trình điều khiển ODP.NET Managed, tất nhiên.
Wernfried Domscheit

1
Tôi nghĩ rằng tôi đã đề cập đến mối quan tâm của mình: (1) Cài đặt cơ sở dữ liệu là vô ích, tức là quá mức cần thiết. (2) Tùy chọn A và B chỉ hoạt động trong một số điều kiện nhất định, ví dụ: nó không đọc bất kỳ Cài đặt NLS nào từ Sổ đăng ký (mà bạn cần tệp oracle.key). Để tương thích, bạn phải đưa các phiên bản nhỏ vào tài khoản. Oracle.DataAccess, Version=2.112.2.0không hoạt động với OraOps11w.dllphiên bản 2.112.4.0 chẳng hạn.
Womsfried Domscheit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.