Penyedia tidak kompatibel dengan versi klien Oracle

157

Saya mencoba menggunakan Klien Instan Oracle ODP.NET 11g (11.1.0.6.20) di proyek ASP.net saya sebagai Penyedia Data tetapi ketika saya menjalankan halaman aspx saya mendapatkan " Penyedia tidak kompatibel dengan versi "pesan klien Oracle ". Bantuan apa pun akan dihargai.

Saya telah mereferensikan Penyedia Data dalam Visual Studio 2005 dan kode di belakangnya terlihat seperti ini:

using Oracle.DataAccess.Client;
..

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

//Do Something

oOracleConn.Close();

Kesalahan untuk halaman terlihat seperti ini:

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

Jawaban:

91

Saya telah melihat masalah ini lebih lanjut, dan Anda hanya perlu mengambil semua DLL yang sesuai dari versi unduhan ODP.Net yang sama dan meletakkannya di folder yang sama dengan file Exe Anda, karena ODP.Net sangat rewel untuk tidak mencampur nomor versi.

Saya telah menjelaskan bagaimana melakukan ini di sini: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Inilah intinya:

  • Unduh ODP.Net
  • Buka zip file
  • Unzip semua JAR yang ada di dalamnya
  • Raih dll ini yang baru saja dibuka ritsletingnya:
    • oci.dll (diubah namanya dari 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (diganti nama dari 'ociw32.dll.dbl')
  • Letakkan semua DLL di folder yang sama dengan C # Anda yang dapat dieksekusi
Chris
sumber
4
Solusi Anda berhasil untuk saya - temukan posting blog Anda sebelum saya menemukan ini. Kamulah orangnya. Terima kasih! :-) Juga, menggunakan ODAC versi terbaru, saya tidak perlu membuka zip salah satu JAR ... file .dll terletak di berbagai direktori di rumah oracle saya. Pencarian windows sederhana mengubahnya sangat cepat.
Pandincus
10
Juga, saya menggunakan versi terbaru ODAC (11.2.0.1.2) pada mesin pengembangan saya, dan satu-satunya file yang saya butuhkan adalah: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Seperti yang ditunjukkan Chris, PASTIKAN MEREKA DI FOLDER YANG SAMA SEBAGAI EXECUTABLE ANDA. ;-)
Pandincus
1
Kedengarannya seperti versi yang lebih baru membuatnya lebih mudah untuk menemukan dll. Bagus! Sekarang berapa lama sampai oracle menggulung mereka menjadi satu dll sederhana ...
Chris
Strategi Chris dan set perpustakaan Pandincus bekerja untuk saya. Saya memanggil klien oracle melalui PowerShell, jadi saya meletakkan perpustakaan di direktori PowerShell yang dapat dieksekusi.
quillbreaker
1
Anda mungkin harus menggunakan driver yang dikelola C # hari ini jika Anda bisa :)
Chris
47

Anda harus "mengabaikan" semua pembicaraan x86 / x64 di sini sebagai permulaan dan sebagai gantinya coba Driver Dikelola ODP.NET (jika Anda menggunakan .Net v4 +):

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

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

Oracle ODP.net Managed vs Driver Tidak dikelola

Hindari semua "tidak dikelola" apa masalah arsitektur apa DLL! : D (sekitar waktu Oracle).

Paket NuGet (juga berfungsi untuk 11g):

masukkan deskripsi gambar di sini

Metode lama / manual:

Untuk info tentang cara mengonversi menggunakan perpustakaan yang dikelola :

  • Pertama, ini adalah perbandingan kode yang bagus dari yang dikelola vs yang tidak dikelola : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Pastikan Anda telah mengunduh versi ODP.NET, Managed Driver Xcopy saja
  • Dari file zip yang diunduh, salin dan tempel ke direktori proyek Anda:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Tambahkan referensi ke Oracle.ManagedDataAccess.dll
  • Pastikan exe Anda dirilis (ditambahkan ke Folder Aplikasi di VS2010) dengan kedua dll
Tod Thomson
sumber
3
Berita baiknya adalah Oracle akhirnya memiliki driver yang sepenuhnya dikelola. Menyembunyikan sekitar 100MB dll telah menjadi beban nyata.
Jafin
1
driver terkelola bekerja sangat baik untuk saya - saya tidak punya masalah sejak pindah ke sana / Anda dapat mengatur proyek Anda kembali ke AnyCPU dll dan bekerja dengan sangat baik :)
Tod Thomson
5
Supaya semua orang sadar, sementara penyedia yang Dikelola bagus, ia tidak memiliki banyak fitur yang memungkinkan penyedia penuh. Yakni, enkripsi bawaan Oracle.
Justin Skiles
1
Dokumentasi Oracle cenderung "tersebar" untuk sedikitnya. Berikut ini tautan yang bagus pada beberapa metode yang tidak didukung . Selain itu, pengemudi itu sendiri dilengkapi dengan readmeyang menguraikan beberapa keterbatasan.
Justin Skiles
2
Penggunaan driver terkelola adalah solusi akhir! Saya mengalami nitghtmare setiap kali saya pikir semua waktu yang dihabiskan ketika saya memiliki tipe mismatch
ettore ct
35

Saya hanya menginstal Oracle Data Provider untuk .NET 2.0 (11.1.0.6.20) dan saya tidak menginstal Oracle Instant Client (11.1.0.6.0) .

Saya baru saja menginstalnya dan kesalahannya hilang!

EverTheLearner
sumber
3
Bisakah Anda hanya menyalin 4 DLL klien instan ke folder yang sama dengan EXE Anda, daripada menginstal klien? (file-file ini: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris
2
@ Chris: Ya, Anda bisa. Dalam pengalaman saya, Anda memerlukan oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll, dan oracle.dataaccess.dll
Pakman
Cara lain untuk saya - saya telah menginstal klien, tetapi tidak penyedia
Ev.
33

Ini dapat disebabkan oleh menjalankan .NET runtime 64bit terhadap klien Oracle 32bit. Ini bisa terjadi jika server Anda menjalankan aplikasi di atasnya 64 bit. Ini akan menjalankan aplikasi .NET dengan runtime 64bit. Anda dapat mengatur flag CPU pada proyek Anda di VS untuk berjalan di runtime 32bit.

Daniel
sumber
Baru saja bertemu yang ini. Bekerja di aplikasi uji (32-bit), lalu jatuh di IIS. Daripada mengharuskan semua majelis yang terlibat menjadi 32-bit, saya mengubah ke AppPool 32-bit.
anton.burger
22

Mari kita buat semacam ringkasan:

Pesan kesalahan "Penyedia tidak kompatibel dengan versi klien Oracle" dapat disebabkan oleh beberapa alasan.

  • Anda tidak memiliki Klien Oracle yang diinstal. Dalam hal ini pesan kesalahan memang menyesatkan.

    Penyedia Data Oracle untuk .NET (ODP.NET, yaitu file Oracle.DataAccess.dll) tidak termasuk dalam Oracle Instant Client, harus diinstal secara terpisah (unduh dari Komponen Akses Data Oracle 32-bit (ODAC) atau Komponen Akses Data Oracle 64-bit ( ODAC) Unduhan ) atau Anda harus memilih opsi yang sesuai di Oracle Universal Installer (OUI).

    Catatan, ketika menginstal Oracle Data Provider> = 12.1, maka penyedia tidak secara otomatis terdaftar ke GAC. Anda harus mendaftarkannya secara manual jika perlu, lihat Oracle Doc 2272241.1 .

  • Versi ODP.NET tidak cocok dengan versi yang diinstal dari Klien Oracle. Anda harus memeriksa bahkan nomor versi minor! Sebagai contoh, Oracle.DataAccess.dllVersi 4.112.3.0 tidak kompatibel dengan Oracle Client 11.2.0.4 . Periksa versi ODP.NET dan Oracle Client dengan cermat. Anda dapat menggunakan sigcheck pada oraociei*.dlldan / atauOraOps*w.dll untuk mendapatkan versi Oracle Client.

    Waspadai skema penomoran yang berbeda. Versi file 4.112.3.0 berarti: .NET Framework Versi 4, Oracle Release 11.2.0.3.x .

    Ada versi ODP.NET "1.x", "2.x" dan "4.x". Angka-angka ini terkait dengan Microsoft .NET Framework versi 1.0.3705 / 1.1.4322, 2.0.50727 dan 4.0.30319. Versi "1.x" tersedia hingga Oracle Client 11.1. Versi "4.x" diperkenalkan dengan Oracle Client 11.2

  • Arsitektur (32bit atau 64bit) ODP.NET tidak cocok dengan arsitektur aplikasi Anda. Aplikasi 32bit hanya berfungsi dengan 32bit Oracle Client / ODP.NET, masing-masing aplikasi 64bit membutuhkan Oracle Client / ODP.NET 64bit. (Kecuali jika Anda menggunakan Driver Terkelola ODP.NET )

  • Versi .NET Framework tidak cocok. Misalnya, jika Anda mengkompilasi aplikasi Anda dengan Target .NET Framework 2.0 maka Anda tidak dapat menggunakan ODP.NET versi 4.x. Versi target .NET Framework harus sama atau lebih tinggi dari versi ODP.NET.

  • Versi Oracle.DataAccess.dll pada mesin pengembangan Anda (yaitu versi yang dimuat saat kompilasi) lebih tinggi daripada versi di mesin target.

  • Perlu diketahui bahwa Oracle.DataAccess.dllmungkin diambil dari GAC yang secara default lebih diutamakan daripada file yang disediakan secara lokal.

Solusi

  • Pertimbangkan untuk menggunakan Driver Dikelola ODP.NET, dapat diunduh dari halaman Oracle: 64-bit Oracle Data Access Components (ODAC) Downloads . Di sana Anda hanya perlu menyalin Oracle.ManagedDataAccess.dllfile ke direktori aplikasi Anda, tidak ada lagi yang diperlukan. Ia bekerja untuk 32bit dan 64bit.

  • Di Anda *.csproj, resp. *.vbprojedit referensi Anda ke ODP.NET seperti ini:

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

    Atribut suka Version=...atau processorArchitecture=...tidak wajib. Aplikasi Anda akan memuat yang benar Oracle.DataAccess.dlltergantung pada arsitektur yang dipilih dan target .NET framework (asalkan diinstal dengan benar) -> tidak 100% diverifikasi

  • Jika Anda tidak tahu versi Oracle Client pada mesin target (mis. Mungkin itu adalah mesin pelanggan Anda): Buka halaman unduhan yang disebutkan di atas dan unduh versi XCopy paling sedikit dari Komponen Akses Data Oracle. Ekstrak zip dan salin saja Oracle.DataAccess.dllfile ke mesin lokal Anda. Dalam proyek VS Anda, buat referensi ke DLL ini (kemungkinan besar sudah usang). Versi DLL ini adalah versi paling tidak dari ODP.NET yang akan digunakan oleh aplikasi Anda. Ketika Anda menjalankan aplikasi Anda maka Kebijakan Penerbit di GAC akan mengalihkan ke versi yang benar-benar diinstal.

  • Saya tidak berpikir itu adalah pendekatan yang cerdas untuk mengambil satu DLL dan menyalinnya ke folder tertentu. Ini dapat bekerja pada mesin "telanjang" tetapi jika mesin target Anda telah menginstal produk Oracle ada risiko tinggi untuk ketidakcocokan versi. Copot semua produk Oracle dari mesin Anda dan buat instalasi baru. Lihat Cara menghapus / menghapus Oracle 11g (klien) sepenuhnya? Untuk mendapatkan mesin yang benar-benar bersih.

  • Jika Anda harus bekerja dengan aplikasi 32bit dan 64bit secara bersamaan, ikuti instruksi ini untuk menginstal kedua versi pada satu mesin:

Asumsi: Oracle Home disebut OraClient11g_home1, Versi Klien adalah 11gR2.

  • Secara opsional hapus semua klien Oracle yang diinstal

  • Unduh dan instal Oracle x86 Client, misalnya ke C:\Oracle\11.2\Client_x86

  • Unduh dan instal Oracle x64 Client ke folder yang berbeda, misalnya untuk C:\Oracle\11.2\Client_x64

  • Buka alat baris perintah, buka folder% WINDIR% \ System32, biasanya C:\Windows\System32dan buat tautan simbolis ora112ke folder C:\Oracle\11.2\Client_x64(lihat di bawah)

  • Ubah ke folder% WINDIR% \ SysWOW64, biasanya C:\Windows\SysWOW64dan buat tautan simbolis ora112ke folder C:\Oracle\11.2\Client_x86, (lihat di bawah)

  • Ubah PATHvariabel lingkungan, ganti semua entri seperti C:\Oracle\11.2\Client_x86dan C:\Oracle\11.2\Client_x64oleh C:\Windows\System32\ora112, masing-masing \binsubfoldernya. Catatan: C:\Windows\SysWOW64\ora112tidak boleh berada di lingkungan PATH.

  • Jika perlu atur ORACLE_HOMEvariabel lingkungan Anda keC:\Windows\System32\ora112

  • Buka Editor Registri Anda. Tetapkan nilai Registry HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEkeC:\Windows\System32\ora112

  • Tetapkan nilai Registry HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEke C:\Windows\System32\ora112(bukan C:\Windows\SysWOW64\ora112)

  • Kamu selesai! Sekarang Anda dapat menggunakan klien Oracle x86 dan x64 dengan mulus, yaitu aplikasi x86 akan memuat pustaka x86, aplikasi x64 memuat pustaka x64 tanpa modifikasi lebih lanjut pada sistem Anda.

Perintah untuk membuat tautan simbolis:

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

Beberapa catatan:

  • Kedua tautan simbolik harus memiliki nama yang sama, mis ora112.

  • Jika Anda ingin menginstal ODP.NET secara manual sesudahnya, berhati-hatilah untuk memilih folder yang sesuai untuk instalasi.

  • Meskipun folder namanya C:\Windows\System32berisi pustaka x64, sedangkan pustaka C:\Windows\SysWOW64berisi x86 (32-bit). Jangan bingung.

  • Mungkin itu adalah pilihan bijak untuk mengatur TNS_ADMINvariabel lingkungan Anda (resp. TNS_ADMINEntri di Registry) ke lokasi umum, misalnya TNS_ADMIN=C:\Oracle\Common\network.

Wernfried Domscheit
sumber
IMO ini memiliki lebih banyak pengetahuan untuk diambil daripada jawaban yang sebenarnya. Jadi jika saya memiliki aplikasi x86 untuk .net 4 dan versi database dalam 9i, maka versi klien apa yang harus dimiliki pengguna jika mereka memiliki Windows 32 atau 64-bit? Oracle mengatakan setiap versi klien kompatibel dengan versi db. Apakah jawabannya dengan pengguna 32-bit menginstal versi 32-bit dan pengguna 64-bit menginstal versi 64-bit dan menggunakan Driver Dikelola ODP.NET untuk memutuskan OS mana yang ia ajak bicara?
Luminous
1
Ketika Anda menggunakan ODP.NET Managed Driver maka tidak diperlukan untuk menginstal klien Oracle - itulah keuntungan utama. Ini berfungsi dengan aplikasi x86 dan x64. Tanpa "ODP.NET Managed Driver" aplikasi x86 juga memerlukan Klien Oracle x86 (yaitu 32-bit), tidak peduli apa pun arsitektur server database.
Wernfried Domscheit
Saya baru saja berlari ke "Microsoft Visual C ++ 2010 Redistributable perlu diinstal" - Anda harus menambahkannya ke ringkasan Anda.
Jay Sullivan
1
Saya tidak berpikir kesalahan ini terkait atau disebabkan oleh Oracle atau ODP.NET
Wernfried Domscheit
Ini berfungsi untuk saya, saya menginstal Oracle.DataAccess.dlldari paket nuget Oracle.DataAccess.x86, dan Versi Dll-nya 2.112.1.0, jadi saya cocok menginstal Oracle Client dengan versi Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) DI SINI kemudian masalah terpecahkan!
yu yang Jian
6

Setelah beberapa jam pemecahan masalah, saya menemukan masalah ini disebabkan oleh memiliki Oracle.DataAccess.dll (v4.0) di direktori bin proyek saya, tetapi runtime juga memuat Oracle.DataAccess.dll (v2.x) dari GAC. Menghapus dan membaca entri Oracle.DataAccess dalam referensi proyek memecahkan masalah bagi saya.

File-file lain yang disebutkan di sini tampaknya tidak diperlukan dalam situasi saya.

MEMPERBARUI

Penyebab utama kesalahan "Penyedia tidak kompatibel dengan versi klien Oracle" adalah (umumnya) bahwa rakitan terkelola berusaha memuat pustaka yang tidak dikelola yang tidak cocok dengan versi. Tampaknya Anda dapat memaksa pengandar Oracle untuk menggunakan pustaka yang benar dengan menentukan lintasan pustaka di web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
psaxton
sumber
Terima kasih! Solusi Anda memberi saya ide yang berfungsi setelah 2 hari (saya punya Visual Studio 2010 Net 4, klien Oracle 10g) ... Saya melihat GAC dan tentu saja saya telah menginstal 3 simpul Oracle.DataAccess.dll, saya membatalkan unistall semua (dan hapus kunci machine.config yang tidak valid di "DbProviderFactories"), dan instal ulang hanya ODAC1120320 x64. Dan itu berhasil.
Hernaldo Gonzalez
5

instal ODP.Net pada mesin target dan itu harus menyelesaikan masalah ... menyalin dll tidak terlihat ide yang bagus ...

HainKurt
sumber
5

Untuk Oracle 11g (11.1.0.7.20) saya harus menambahkan dll berikut ini bersama dengan Exe saya untuk bekerja.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (cukup besar hampir 30mb)
  4. Oracle.DataAccess.dll
SKG
sumber
Anda ingin mengatakan 130 MB
Elmue
2

Tampak bagi saya bahwa meskipun Anda memiliki ODP dengan Oracle Istant Client, ODP mungkin mencoba menggunakan Klien Oracle yang sebenarnya. Apakah Anda memiliki klien Oracle standar yang diinstal pada mesin juga? Saya ingat Oracle agak pilih-pilih soal beberapa klien di mesin yang sama.

Peter Meyer
sumber
2

Saya memiliki masalah yang sama persis. Saya menghapus (dan lupa bahwa saya telah menghapus) oraociei11.dll setelah kompilasi aplikasi. Dan itu memberikan kesalahan ini ketika mencoba mengeksekusi. Jadi ketika tidak dapat menemukan dll yang oraociei11.dll, ini menunjukkan kesalahan ini. Mungkin ada kasus lain ketika memberikan kesalahan ini, tetapi ini tampaknya menjadi salah satunya.


sumber
2

Juga cari kumpulan Aplikasi IIS Aktifkan flag benar atau salah 32-bit, ketika Anda melihat pesan ini, beberapa forum oracle mengarahkan saya untuk ini!

Hydtechie
sumber
2

saya memiliki masalah yang sama tetapi dalam kasus saya saya tidak bisa hanya menyalin dll ke folder bin, maka saya hanya 'rebind' versi assembly.

<?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>
calderonsteven
sumber
2

Inilah yang saya lakukan untuk mengatasi masalah ini yang bertahan selama 3 jam:

  1. Di bawah rumah Oracle yang terletak di C:\oracle\product\11.2.0saya memiliki folder bernama di client_1mana saya sebelumnya menginstal ODP.NETbit untuk Windows 64 bit.

  2. Kemudian ketika mencoba men-debug aplikasi ASP.NET Web API saya dengan Visual Studio 2012, saya terus mendapatkan pesan kesalahan ini: Penyedia tidak kompatibel dengan versi klien Oracle .

  3. Mencari di Google saya menemukan bahwa ini terjadi karena saya menggunakan ODP.NET64 bit. Kemudian saya meraih ODP.NETWindows 32 bit dan menginstalnya tetapi saya terus mendapatkan pesan kesalahan yang sama.

  4. SOLUSI: menghapus folder client_1dan memasang ODP.NET32 bit. Agaknya installer sedang mencampur bit dari versi 64 bit dengan versi 32 bit. Go figure ...

  5. Sekarang saya senang lagi dan saya bisa membuka yang baru OracleConnection. AKHIRNYA! :)

Leniel Maccaferri
sumber
2

Bagi siapa pun yang masih memiliki masalah ini: berdasarkan artikel ini

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

Saya menemukan bahwa server saya tidak memiliki Microsoft C ++ Visual Runtime Library - Saya memilikinya di mesin dev saya karena Visual Studio diinstal. Saya mengunduh dan menginstal versi terbaru perpustakaan dari sini:

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

Menjalankan pengaturan dan panggilan oracle dari C # berhasil!

dabor
sumber
1
Bung .... Oracle .... bisakah kita berdiskusi sedikit? Kemarilah, di sudut. Dengar, aku menghabiskan sepanjang hari mencari tahu apa yang dimaksud dengan "penyedia tidak kompatibel", hanya untuk mengetahui kemudian bahwa itu karena beberapa ketergantungan instalasi tidak terpenuhi. Tolong - tidak - saya meminta Anda membuat installer Anda memeriksa dependensi ini pada waktu instalasi, dan memperingatkan pengguna jika tidak terpenuhi. Terima kasih.
Jay Sullivan
3
Ngomong-ngomong, saya harus kembali ke pertanyaan stackoverflow ini pada beberapa kesempatan, dan jawaban yang berbeda berlaku untuk saya setiap saat. Buang-buang waktu dan uang ini telah menyebabkan.
Jay Sullivan
2

Versi TLDR:

  • Gunakan penyedia terkelola 12c 100% sebagai gantinya.
  • Jika Anda harus menggunakan penyedia yang lama, Anda harus mengarahkan Oracle.DataAccess.dll ke Oracle Client Dlls yang tidak dikelola yang memiliki versi yang benar. Jika Anda memiliki beberapa Klien Oracle yang diinstal pada mesin Anda yang mungkin sederhana seperti termasuk variabel konfigurasi "DllPath" (lihat di bawah) dalam konfigurasi aplikasi Anda, tetapi Anda mungkin perlu menginstal klien oracle baru untuk menunjuk.

Versi lengkap:

Pertama, mari pastikan kita memahami komponen dari penyedia yang tidak rusak yang lama (bukan 12c 100% provider yang dikelola). Itu terdiri dari dua bagian:

  1. komponen .net yang dikelola - Oracle.DataAccess.dll
  2. klien (non-.net) yang tidak dikelola

Sederhananya, Oracle.DataAccess.dll hampir hanya pembungkus, menerjemahkan instruksi .net ke dalam instruksi ORACLE-NET untuk klien yang tidak dikelola.

Yang mengatakan, ketika Anda memuat Oracle.DataAccess ada urutan di mana ia mencoba untuk menemukan dll klien yang tidak dikelola yang diperlukan. Dari Dokumentasi Oracle :

Oracle.DataAccess.dll mencari DLL tidak dikelola yang tergantung (seperti Oracle Client) berdasarkan urutan berikut:

1. Direktori aplikasi atau yang dapat dieksekusi.

Pengaturan 2.DllPath ditentukan oleh konfigurasi aplikasi atau web.config.

Pengaturan 3.DllPath ditentukan oleh machine.config.

Pengaturan 4.DllPath ditentukan oleh Windows Registry.

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

5. Direktori yang ditentukan oleh variabel lingkungan Windows PATH.

Jadi dalam kasus Anda, aplikasi Anda mengikuti proses ini di atas dan menemukan jalur yang memiliki dll yang tidak beraturan yang terlalu tua relatif terhadap perakitan Oracle.DataAccess.dll yang Anda gunakan.

Bisa jadi satu-satunya Oracle Client yang diinstal pada mesin itu terlalu tua. Tetapi ini mulai berlaku jika Anda memiliki lebih dari satu klien yang diinstal pada mesin dan file-file yang tidak rusak ditemukan pertama kali pada instalasi yang berbeda namun lebih lama. Jika nanti, hal sederhana yang harus dilakukan adalah menggunakan variabel konfigurasi dllPath dalam konfigurasi Anda dan arahkan ke folder Oracle Home Bin yang benar:

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

Jika Anda ingin menginstal salinan baru klien, versi xcopy adalah yang terkecil dan berisi "klien instan" dan arahkan DllPath di atas ke lokasi baru ini. Tetapi setiap instalasi klien oracle akan bekerja.

Tetapi jika Anda ingin menghindari semua hal resolusi klien yang tidak dikelola ini, lihat apakah Anda dapat memperbarui aplikasi Anda untuk menggunakan penyedia yang dikelola 100% - itu benar-benar hanya satu atau dua rakitan yang dikelola, tanpa ketergantungan pada file yang tidak dikelola.

Mungkin juga Anda tidak memuat Oracle.DataAccess.dll yang Anda pikir sudah terpasang di direktori bin dan GAC Anda, tetapi menurut saya itu kemungkinan adalah senario. Lihat proses resolusi perakitan untuk informasi lebih lanjut.

b_levitt
sumber
1

Apakah pengguna IIS / IWAM memiliki izin pada direktori Oracle? Bisakah Anda terhubung ke sumber data ini menggunakan aplikasi lain, seperti Excel atau Access?

DCookie
sumber
1

Kami memiliki masalah yang sama, karena perakitan Oracle.Data.dll pada jaringan berbagi diperbarui oleh DBA kami. Menghapus referensi dari proyek, dan menambahkannya lagi menyelesaikan masalah.

doekman
sumber
1

Hanya dua langkah untuk mengatasi masalah ini.

  1. buka pengaturan muka kumpulan aplikasi dan setel tanda 'Aktifkan Aplikasi 32 bit ke Benar.
  2. Pastikan semua Dll di Bin Anda adalah versi 32 bit sekarang ...

semoga berhasil.

Mazhar Abbas
sumber
@ mazhar-abbas, Bisakah Anda tolong. tunjukkan di mana saya dapat mengatur 'Aktifkan Aplikasi 32 bit? Apakah itu di IIS atau Proyek?
hiFI
1

Saya tidak pergi jalan mendapatkan DLL baru. Kami memiliki banyak proyek yang sudah berjalan dengan sangat baik dan hanya proyek baru saya yang membuat saya pusing, jadi saya memutuskan untuk mencoba yang lain.

Proyek saya menggunakan Internal.dll yang dikembangkan secara internal yang bergantung pada Oracle.DataAccess.dll v4.112.3.0. Entah mengapa, saat penerbitan, Visual Studio selalu diunggahv4.121.0.0 , meskipun itu tidak ditentukan secara eksplisit di salah satu file konfigurasi. Itu sebabnya saya mendapatkan kesalahan.

Jadi yang saya lakukan adalah:

  1. Disalin Internal.dll dari salah satu proyek yang berhasil berjalan ke situs web saya /bin(hanya untuk berada di sisi yang aman).
  2. Disalin Oracle.DataAccess.dll dari salah satu proyek yang berhasil berjalan ke situs web saya /bin.
  3. Tambahkan Referensi ke keduanya dari situs web saya.
  4. Akhirnya referensi Oracle.DataAccess muncul di myWebSite.csproj, tetapi itu menunjukkan versi yang salah: v4.121.0.0bukannya v4.112.3.0.
  5. Saya secara manual mengubah referensi myWebSite.csproj, jadi sekarang baca:

    <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> 
Robotron
sumber
2
Itu ide yang sangat buruk untuk menambahkan referensi ke dll di folder bin.
Jay Sullivan
1
The bindan objfolder yang keluaran folder; ini adalah di mana dll pergi ketika Anda membangun proyek Anda. Anda harus dapat menghapus folder ini kapan saja tanpa menimbulkan konflik. Biasanya folder ini diabaikan dalam kontrol sumber. Praktik standar adalah membuat External Referencesfolder tempat Anda meletakkan dll yang direferensikan.
Jay Sullivan
@notfed Sepertinya Anda benar. Akan menyimpan ini di pikiranku.
Robotron
Seperti namanya itu hanya jalur petunjuk untuk kompiler, bukan referensi pemaksa. Pertama, GAC mencari Oracle.DataAccess.dll. Itu harus bekerja bahkan jika Anda menghapus HintPathseluruhnya.
Wernfried Domscheit
1

Saya mengalami masalah ini setelah saya menginstal Oracle Data Tools untuk Visual Studio 2015, dan kemudian berkelahi dengan Oracle selama satu jam yang baik. Saya memutuskan untuk mencoba menginstal ulang klien Oracle bukan kekacauan ini dengan menyalin file, perubahan konfigurasi, dll., Dan itu berhasil bagi saya.

David Spenard
sumber
1

Saya menghadapi masalah yang sama dan akar penyebabnya adalah bahwa GAC ​​memiliki 2 versi oracle.dataaccess yaitu v4.0_4.112.2.0 dan v4.0_4.112.4.0. Aplikasi saya merujuk ke v4.0_4.112.2.0, jadi ketika saya menghapus v4.0_4.112.4.0 dari GAC, itu berfungsi dengan baik.

Jalur GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

Sebelum : masukkan deskripsi gambar di sini

Setelah: masukkan deskripsi gambar di sini

Untuk menghapus versi, seseorang cukup menghapus folder yang sesuai dari GAC.

p4ulinux
sumber
0

Baru-baru ini saya harus mengerjakan proyek lama di mana solusi dan semua proyek yang ada ditargetkan untuk platform x32. Saya terus mencoba menyalin Oracle.DataAccess.dll dan semua file Oracle lainnya yang disarankan di semua tempat, tetapi membentur tembok setiap saat. Akhirnya bola lampu di kepala menyala (setelah 8 jam :)), dan diminta untuk memeriksa rakitan ODAC yang terpasang dan platform mereka. Saya sudah menginstal semua klien ODAC 64-bit (x64) tetapi tidak dengan yang 32 bit (x32). Menginstal ODAC 32-bit dan masalahnya hilang.

Cara memeriksa versi ODAC yang diinstal: Lihat di folder C: \ Windows \ assembly. Properti "Arsitektur Prosesor" akan menginformasikan platform ODAC yang diinstal.

Delapan jam adalah waktu yang lama bagi bohlam untuk menyala. Tidak heran saya selalu harus bekerja keras di tempat kerja :).

DiligentKarma
sumber
Catatan, C:\Windows\assembliescukup tampilkan rakitan hingga .NET framework versi 2.0. Versi 3.x / 4.x tidak ditampilkan, lihat stackoverflow.com/questions/28213105/…
Wernfried Domscheit
0

Solusi Chris juga bermanfaat bagi saya. Namun saya mendapatkan pesan kesalahan ikuti yang menyatakan:

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.

Rupanya, dalam bahasa asing Oraclish, itu berarti program Anda menargetkan semua platform, atau mesin 32-bit. Cukup ubah platform target Anda di Project Properties menjadi 64-bit dan berharap yang terbaik.

Cameron Castillo
sumber
3
Itu sebenarnya .NETish, bukan Oraclish
Jay Sullivan
0

Saya memiliki masalah yang sama dengan Oracle.DataAccess.dll v4.121.2.0. dengan instalasi 2-rumah (versi 32 dan 64 bit). Workerd versi 32-bit, versi 64-bit tidak.

Dalam kasus saya (setelah 2 hari mencoba) saya menemukan bahwa masalahnya adalah izin pada versi 64-bit-home. Banyak Direktori dalam versi itu yang secara eksklusif menimpa izin di mana peran "Pengguna yang Diotentikasi" tidak memiliki akses "Baca", yang ditetapkan secara default pada direktori induk. Sub-direktori tersebut termasuk "bin", "network / admin", "nls", "oracore", "RDBMS" dan mungkin yang lainnya. Saya menemukan mereka dengan menyaring "AKSES DITOLAK" menghasilkan utilitas "Proses Monitor" (Procmon.exe) dari sysinternals. Setelah izin diwarisi dari direktori induk ke subdirektori anak itu, semuanya mulai berfungsi.

Saya tidak tahu apa yang harus mengesampingkan izin di seluruh rumah oracle jadi saya melakukannya mereka satu direktori pada suatu waktu, tetapi saya kira jika Anda tidak khawatir tentang keamanan sehingga Anda dapat mengatur ulang pada seluruh direktori home oracle yang sesuai.

Greg Z.
sumber
-3

Banyak jawaban teoretis di sini, tetapi inilah contoh kerja dengan kode yang dapat Anda salin dan tempel dan uji segera:

  1. Saya menginstal database Oracle Express, OracleXE112 yang sudah dilengkapi dengan beberapa tabel demo yang sudah diinstal.
  2. Saat Anda memulai pemasang, Anda akan diminta kata sandi . Saya memasukkan "xxx" sebagai kata sandi. (tidak digunakan dalam produksi)
  3. Server saya berjalan pada mesin 192.168.1.158
  4. Di server Anda harus secara eksplisit mengizinkan akses untuk proses TNSLSNR.exe di Windows Firewall . Proses ini mendengarkan pada port 1521. Jika Anda mendapatkan kesalahan batas waktu dari kode di bawah ini periksa firewall Anda.
  5. OPSI A: Untuk C # (.NET2 atau .NET4) Anda dapat mengunduh ODAC11 , dari mana Anda harus menambahkan Oracle.DataAccess.dll ke proyek Anda. Selain itu, DLL ini bergantung pada: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. DLL ini harus dalam direktori yang sama seperti EXE atau Anda harus menentukan jalur DLL di: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Pada mesin 64 bit tulis jugaHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPSI B: Jika Anda telah mengunduh ODAC12, Anda memerlukan Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), Oraons.dll, msvcr100.dll. Jalur Registry adalahHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPSI C: Jika Anda tidak ingin DLL besar lebih dari 100 MB, Anda harus mengunduh ODP.NET_Managed12.xxxxxxxx.zip di mana Anda menemukan Oracle.ManagedDataAccess.dllyang hanya 4 MB dan DLL dikelola murni yang bekerja dalam proses 32 bit dan 64 bit juga dan tidak bergantung pada DLL lain dan tidak memerlukan entri registri.
  8. Kode C # berikut ini berfungsi untuk saya tanpa konfigurasi di sisi server (hanya instalasi default):
menggunakan Oracle.DataAccess.Client;
atau
menggunakan Oracle.ManagedDataAccess.Client;

....

string oradb = "Sumber Data = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "Id Pengguna = SISTEM; Kata Sandi = xxx;";

menggunakan (OracleConnection conn = new OracleConnection (oradb)) 
{
    samb.Buka ();
    menggunakan (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = samb;
        cmd.CommandText = "pilih TABLESPACE_NAME dari DBA_DATA_FILES";

        menggunakan (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}
Elmue
sumber
Cukup banyak untuk menginstal seluruh server database Oracle ketika Anda hanya perlu menjalankan klien.
Wernfried Domscheit
Jawaban Anda buruk. Tidak perlu menyalin Oracle dll ke direktori aplikasi karena secara default instalasi Anda menemukannya melalui ‰ PATH% (kecuali jika Anda memodifikasinya sendiri). Petunjuk Registy hanya berlaku untuk.versi 4.x dan hanya berfungsi untuk Klien Oracle 32-
bit.Namun
Komentar Anda menunjukkan bahwa Anda tidak membaca jawaban saya. Jika saya ingin menulis aplikasi yang berkomunikasi dengan server Oracle, tidak perlu menginstal apa pun dari Oracle. Saya hanya menggunakan DLL yang disebutkan di atas dan distribusikan dengan aplikasi saya. Jadi tidak akan ada apa pun dalam variabel PATH pada mesin pengguna akhir. Ngomong-ngomong menggunakan variabel PATH (yang berasal dari zaman DOS lama dari 1980) sangat usang dalam perangkat lunak modern. Jawaban saya merekomendasikan OPSI C yang tidak memerlukan jalur registri dan tidak bergantung pada 32 atau 64 bit. Saya sebutkan OPSI A dan B hanya untuk kelengkapan.
Elmue
Saya pikir tanpa pengaturan% PATH% yang tepat Windows Anda tidak akan bekerja sama sekali - bahkan dalam versi 10. Saya sebutkan dalam jawaban saya bahwa tidak pintar untuk secara manual menyalin Oracle dll dengan aplikasi Anda. Saya tidak tahu kode sumber dll ini tetapi mungkin ada lebih banyak dependensi di sisi pelanggan Anda yang tidak Anda lihat, misalnya dipicu oleh pengaturan bahasa, set karakter, zona waktu, dll. Ketika saya membuat jejak dengan Oracle.DataAccess.dllmaka program memuat total 35 Oracle DLL! Lebih baik buat instalasi normal dari Klien Oracle - kecuali Anda menggunakan driver yang Dikelola ODP.NET, tentu saja.
Wernfried Domscheit
1
Saya rasa saya sebutkan keprihatinan saya: (1) Menginstal database tidak berguna, yaitu pembunuhan yang berlebihan. (2) Opsi A dan B hanya berfungsi di bawah kondisi tertentu, misalnya tidak membaca NLS-Pengaturan dari Registry (yang Anda perlukan file oracle.key). Untuk kompatibilitas Anda juga harus mempertimbangkan versi minor. Oracle.DataAccess, Version=2.112.2.0tidak bekerja dengan OraOps11w.dllversi 2.112.4.0 misalnya.
Wernfried Domscheit