Sağlayıcı, Oracle istemcisi sürümüyle uyumlu değil


157

Veri Sağlayıcısı olarak ASP.net projemde Oracle ODP.NET 11g (11.1.0.6.20) Instant Client kullanmaya çalışıyorum ama aspx sayfasını çalıştırdığımda " Sağlayıcı sürümle uyumlu değil Oracle istemcisi "hata iletisi. Herhangi bir yardım mutluluk duyacağız.

Visual Studio 2005'te Veri Sağlayıcısı'na başvurdum ve arkasındaki kod şöyle görünüyor:

using Oracle.DataAccess.Client;
..

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

//Do Something

oOracleConn.Close();

Sayfanın hatası şuna benzer:

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

Yanıtlar:


91

Bu soruna daha fazla baktım ve ODP.Net'in aynı indirilen sürümünden tüm uygun DLL'leri almanız ve Exe dosyanızla aynı klasöre koymanız gerekiyor, çünkü ODP.Net karıştırma konusunda titiz sürüm numaraları.

Bunu nasıl yapacağımı burada açıkladım: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c İşte bunun özü:

  • ODP.Net'i indirin
  • Dosyayı açın
  • İçindeki tüm JAR'ları aç
  • Sadece sıkıştırılmış olan bu dll'leri al:
    • oci.dll ('oci.dll.dbl' olarak yeniden adlandırıldı)
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll ('ociw32.dll.dbl' olarak yeniden adlandırıldı)
  • Tüm DLL'leri C # Yürütülebilir ile aynı klasöre koyun

4
Çözümünüz benim için çalıştı - bunu bulmadan önce blog yayınınızı buldu. Adamsın. Teşekkürler! :-) Ayrıca, ODAC en son sürümünü kullanarak, herhangi bir JARs unzip gerek yoktu ... .dll dosyaları benim oracle evinde çeşitli dizinlerde bulunan. Basit bir Windows araması çok hızlı bir şekilde ortaya çıktı.
Pandincus

10
Ayrıca, geliştirme makinemde ODAC (11.2.0.1.2) en son sürümünü kullanıyordum ve ihtiyacım olan tek dosyalar: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Chris'in de belirttiği gibi, onların aynı katmanda gerçekleştirilebileceğinden emin ol. ;-)
Pandincus

1
Yeni sürüm gibi geliyor dll's bulmayı kolaylaştırır. Harika! Şimdi ne kadar kehanet onları basit bir dll haline getiriyor ...
Chris

Chris'in stratejisi ve Pandincus kütüphanesi benim için çalıştı. PowerShell aracılığıyla oracle istemcisi çağırıyorum, bu yüzden PowerShell çalıştırılabilir dizine kitaplığı koymak.
Quillbreaker

1
Mümkünse bugünlerde C # yönetilen sürücüyü kullanmalısınız :)
Chris

47

Yeni başlayanlar için burada tüm x86 / x64 konuşmasını "yoksaymalısınız" ve bunun yerine ODP.NET Yönetilen Sürücüsünü denemelisiniz (.Net v4 + kullanıyorsanız):

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

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

Oracle ODP.net Yönetilen vs Yönetilmeyen Sürücü

Tüm "yönetilmeyen" ne DLL ne mimari sorunları kaçının! : D (yaklaşık Oracle zamanı).

NuGet paketi (ayrıca 11g için çalışır):

resim açıklamasını buraya girin

Eski / manuel yöntem:

Yönetilen kitaplıkların kullanımına nasıl dönüştürüleceği hakkında bilgi için :

  • İlk olarak, yönetilen ile yönetilmeyen arasındaki harika bir kod karşılaştırması : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Yalnızca ODP.NET, Yönetilen Sürücü Xcopy sürümünü indirdiğinizden emin olun
  • İndirilen zip dosyasından kopyalayıp proje dizininize yapıştırın:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Oracle.ManagedDataAccess.dll dosyasına bir başvuru ekleyin
  • Her iki dll ile exe ( VS2010 uygulama klasörüne eklendi) yayımlandığından emin olun

3
Oracle'ın sonunda tamamen yönetilen bir sürücüye sahip olduğu iyi bir haber. Bu 100mb dll etrafında Lugging gerçek bir yük oldu.
Jafin

1
G / geri AnyCPU vb projelerinizi ayarlayabilirsiniz buna geçiş beri hiçbir sorun yaşadım ve onu :) inşaat büyük - yönetilen sürücü benim için büyük işler
Tod Thomson

5
Herkesin farkında olması için, Yönetilen sağlayıcı güzel olsa da, tam sağlayıcının izin verdiği birçok özellikten yoksundur. Yani, Oracle yerleşik şifreleme.
Justin Skiles

1
Oracle'ın belgeleri en azından söylemek gerekirse "dağınık" olma eğilimindedir. İşte bazı desteklenmeyen yöntemlerle ilgili iyi bir bağlantı . Buna ek olarak, sürücünün kendisi readmebazı sınırlamaların ana hatlarını veren bir ile birlikte gelir .
Justin Skiles

2
Yönetilen sürücünün kullanımı nihai çözümdür! Ben bir tür uyuşmazlığı vardı harcanan her zaman düşünüyorum bir nitghtmare ettik
ettore ct

35

Yalnızca .NET 2.0 (11.1.0.6.20) için Oracle Veri Sağlayıcısı'nı yükledim ve Oracle Instant Client'ı (11.1.0.6.0) yüklemedim .

Yeni yükledim ve hata kayboldu!


3
4 anlık istemci DLL'leri istemciyi yüklemek yerine EXE'inizle aynı klasöre kopyalayabilir misiniz? (bu dosyalar: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris

2
@Chris: Evet, yapabilirsin. Deneyimlerime göre, oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll ve oracle.dataaccess.dll
Pakman

Benim için başka bir yol - Ben müşteri yükledim, ama sağlayıcı değil
Ev.

33

Bunun nedeni, 32bit Oracle istemcisine karşı 64bit .NET çalışma zamanı çalıştırmak olabilir. Bu, sunucunuzda uygulamayı 64 bit üzerinde çalıştırıyorsanız oluşabilir. .NET uygulamasını 64bit çalışma zamanı ile çalıştıracaktır. Projenizdeki CPU bayrağını VS'de 32 bit çalışma zamanında çalışacak şekilde ayarlayabilirsiniz.


Sadece bununla karşılaştım. Bir (32 bit) test uygulamasında çalıştı, sonra IIS'ye düştü. İlgili tüm derlemelerin 32 bit olmasını gerektirmek yerine, 32 bit AppPool olarak değiştirdim.
anton.burger

22

Bir çeşit özet yapalım:

"Sağlayıcı, Oracle istemcisinin sürümüyle uyumlu değil" hata mesajının çeşitli nedenleri olabilir.

  • Yüklü bir Oracle Client yok. Bu durumda hata mesajı gerçekten yanıltıcıdır.

    .NET için Oracle Veri Sağlayıcısı (ODP.NET, yani dosya Oracle.DataAccess.dll) Oracle Instant Client'a dahil değildir, ayrı olarak yüklenmesi gerekir ( 32 bit Oracle Veri Erişim Bileşenleri (ODAC) veya 64 bit Oracle Veri Erişim Bileşenlerinden ( ODAC) Yüklemeler ) veya Oracle Universal Installer'da (OUI) ilgili seçeneği belirlemeniz gerekir.

    Oracle Veri Sağlayıcısı> = 12.1'i yüklerken, sağlayıcı otomatik olarak GAC'ye kaydedilmez. Gerekirse manuel olarak kaydetmeniz gerekir, bkz. Oracle Doc 2272241.1 .

  • ODP.NET sürümü, yüklü Oracle Client sürümüyle eşleşmiyor. Küçük sürüm numarasını bile kontrol etmelisiniz! Örneğin, Oracle.DataAccess.dllSürüm 4.112.3.0 , Oracle Client 11.2.0.4 ile uyumlu değildir . ODP.NET ve Oracle Client sürümlerini dikkatlice kontrol edin. Oracle Client sürümünü almak için ve / veya üzerindeki işaret işaretini kullanabilirsiniz .oraociei*.dllOraOps*w.dll

    Farklı numaralandırma şemasının farkında olun. Dosya sürümü 4.112.3.0 araçlar: .NET Framework Sürüm 4, Oracle Yayın 11.2.0.3.x .

    ODP.NET sürümü "1.x", "2.x" ve "4.x" vardır. Bu sayılar Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 ve 4.0.30319 sürümleriyle ilgilidir. Sürüm "1.x" Oracle Client 11.1'e kadar mevcuttu. Oracle Client 11.2 ile "4.x" sürümü tanıtıldı

  • ODP.NET'in mimarisi (32bit veya 64bit), uygulama mimarinizle eşleşmiyor. 32bit bir uygulama yalnızca 32bit Oracle Client / ODP.NET ile çalışır, sırasıyla 64bit bir uygulama 64bit Oracle Client / ODP.NET gerektirir. ( ODP.NET Yönetilen Sürücü kullanmadığınız sürece )

  • .NET Framework sürümü eşleşmiyor. Örneğin, uygulamanızı Target .NET Framework 2.0 ile derlerseniz, ODP.NET sürüm 4.x'i kullanamazsınız. .NET Framework hedef sürümü, ODP.NET sürümüne eşit veya daha yüksek olmalıdır.

  • Sürümü Oracle.DataAccess.dllgeliştirme makinenizde (yani derleme sırasında yüklenen versiyon) hedef makinede sürümden daha yüksektir.

  • Unutmayın Oracle.DataAccess.dllyüklenen olabilir GAC varsayılan olarak herhangi lokal sağlanan dosyada önceliklidir.

Çözümler

  • ODP.NET Yönetilen Sürücüsünü kullanmayı düşünün, Oracle sayfasından indirilebilir: 64-bit Oracle Veri Erişim Bileşenleri (ODAC) İndirmeleri . Orada sadece Oracle.ManagedDataAccess.dlluygulama dizininize dosya kopyalamanız gerekir, başka bir şey gerekmez. Hem 32bit hem de 64bit için çalışır.

  • Senin içinde *.csproj, saygı. *.vbprojODP.NET referansınızı şu şekilde düzenleyin:

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

    Gibi Version=...veya processorArchitecture=...gerekli olmayan özellikler. Uygulamanız Oracle.DataAccess.dll, seçilen mimariye ve hedef .NET çerçevesine bağlı olarak doğru yüklenir (düzgün bir şekilde yüklenmesi koşuluyla) ->% 100 doğrulanmamış

  • Hedef makinede Oracle Client sürümünü bilmiyorsanız (örn. Müşterinizin makinesi olabilir): Yukarıda belirtilen indirme sayfasına gidin ve Oracle Data Access Components'ın en az XCopy sürümünü indirin. Zip Oracle.DataAccess.dlldosyasını çıkarın ve yalnızca dosyayı yerel makinenize kopyalayın . VS projenizde bu (büyük olasılıkla güncel olmayan) DLL başvurusunda bulunun. Bu DLL sürümü uygulamanızın çalışacağı en az ODP.NET sürümüdür. Uygulamanızı çalıştırdığınızda, GAC'daki Yayıncı İlkesi gerçekten yüklü sürüme yönlendirir.

  • Tek DLL almak ve belirli klasörlere kopyalamak için akıllı bir yaklaşım olduğunu sanmıyorum. "Çıplak" bir makinede çalışabilir, ancak hedef makineniz herhangi bir Oracle ürünü kurmuşsa, sürüm uyumsuzluğu riski yüksektir. Oracle ürünlerini makinenizden kaldırın ve yeni bir kurulum yapın. Göz at kaldırma için / tamamen Oracle 11g (istemci) kaldırmak nasıl? Gerçekten temiz bir makine almak için sipariş.

  • Aynı anda 32 bit ve 64 bit uygulamalarla çalışmanız gerekiyorsa, her iki sürümü de tek bir makineye yüklemek için bu talimatları izleyin:

Varsayımlar: Oracle Home adı verilir OraClient11g_home1, İstemci Sürümü 11gR2'dir.

  • İsteğe bağlı olarak yüklü tüm Oracle istemcilerini kaldırın

  • Oracle x86 Client'ı indirip yükleyin. C:\Oracle\11.2\Client_x86

  • Oracle x64 Client'ı farklı bir klasöre indirip yükleyin, örneğin C:\Oracle\11.2\Client_x64

  • Açık komut satırı aracı, gitmek için klasör% WINDIR% \ System32, tipik C:\Windows\System32ve sembolik bir bağlantı oluşturmak ora112klasöre C:\Oracle\11.2\Client_x64(aşağıya bakınız)

  • % WINDIR% \ SysWOW64 klasörüne geçin ve klasöre C:\Windows\SysWOW64sembolik bir bağlantı oluşturun , (aşağıya bakın)ora112C:\Oracle\11.2\Client_x86

  • Değiştir PATH, çevre değişkeni gibi tüm girdileri değiştirmek C:\Oracle\11.2\Client_x86ve C:\Oracle\11.2\Client_x64tarafından C:\Windows\System32\ora112, ilgili kendi \binalt klasöründe. Not: C:\Windows\SysWOW64\ora112PATH ortamında olmamalıdır.

  • Gerekirse ORACLE_HOMEortam değişkeniniC:\Windows\System32\ora112

  • Kayıt Defteri Düzenleyicinizi açın. Kayıt defteri değerini şu HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEşekilde ayarlayın:C:\Windows\System32\ora112

  • Ayar kayıt değeri HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEiçin C:\Windows\System32\ora112(değil C:\Windows\SysWOW64\ora112)

  • Bitirdiniz! Artık x86 ve x64 Oracle istemcisini birlikte sorunsuz kullanabilirsiniz, yani x86 uygulaması x86 kitaplıklarını yükleyecektir, x64 uygulaması sisteminizde başka bir değişiklik yapmadan x64 kitaplıklarını yükler.

Sembolik bağlantılar oluşturma komutları:

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

Bazı notlar:

  • Her iki sembolik bağ da aynı ada sahip olmalıdır, örn ora112.

  • Daha sonra ODP.NET'i manuel olarak kurmak isterseniz, kurulum için uygun klasörleri seçmeye dikkat edin.

  • Adlarına rağmen klasör C:\Windows\System32x64 kitaplıklarını, C:\Windows\SysWOW64x86 (32 bit) kitaplıklarını içerir. Kafan karışmasın.

  • Örneğin, TNS_ADMINortam değişkeninizi ( TNS_ADMINKayıt Defterindeki ilgili girdiler) ortak bir konuma ayarlamak akıllıca bir seçenektir TNS_ADMIN=C:\Oracle\Common\network.


Bu IMO'nun asıl cevaptan daha fazla bilgi alması gerekiyor. Yani .net 4 için bir x86 uygulamam varsa ve veritabanı sürümü 9i'de ise, bir kullanıcının 32 veya 64 bit Windows'ları varsa hangi istemci sürümüne sahip olması gerekir? Oracle, herhangi bir istemci sürümünün herhangi bir db sürümüyle uyumlu olduğunu söylüyor. 32-bit kullanıcılarla gelen cevap 32-bit sürümü yüklüyor mu ve 64-bit kullanıcılar 64-bit sürümü yüklüyor ve hangi işletim sistemi ile konuştuğuna karar vermek için ODP.NET Yönetilen Sürücüsünü kullanıyor mu?
Aydınlık

1
ODP.NET Yönetilen Sürücüsünü kullandığınızda, herhangi bir Oracle istemcisinin yüklenmesi gerekmez - ana avantajı budur. Hem x86 hem de x64 uygulamalarıyla çalışır. "ODP.NET Yönetilen Sürücü" olmadan, x86 uygulaması, veritabanı sunucusu mimarisi ne olursa olsun, x86 (yani 32 bit) Oracle Client gerektirir.
Wernfried Domscheit

Sadece "Microsoft Visual C ++ 2010 Yeniden Dağıtılabilir'in yüklenmesi gerekiyor" ile karşılaştım - bunu özetinize eklemelisiniz.
Jay Sullivan

1
Bu hatanın Oracle veya
ODP.NET'ten

Benim için çalışıyor Oracle.DataAccess.dll, nuget paketinden yüklüyorum Oracle.DataAccess.x86ve onun Dll Sürümü 2.112.1.0, bu yüzden Oracle Client'ı Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) BURAYA sürümle yüklemeyi eşleştiriyorum, sonra sorun çözüldü!
yu yang Jian

6

Birkaç saat sorun giderme sonrasında, bu sorunun projeleri bin dizinimde Oracle.DataAccess.dll (v4.0) olmasına neden olduğunu buldum, ancak çalışma zamanı da GAC'den Oracle.DataAccess.dll (v2.x) yükleniyor. Proje başvurularındaki Oracle.DataAccess girdisinin kaldırılması ve okunması sorunu benim için çözdü.

Burada belirtilen diğer dosyalar benim durumumda gerekli görünmüyordu.

GÜNCELLEME

"Sağlayıcı Oracle istemcisinin sürümüyle uyumlu değil" hatasının temel nedeni (genellikle) yönetilen derlemenin sürümlerle eşleşmeyen yönetilmeyen kitaplıkları yüklemeye çalışmasıdır. Görünüşe göre web.config kütüphane yolunu belirterek Oracle sürücüsünü doğru kütüphaneleri kullanmaya zorlayabilirsiniz 1

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

Teşekkürler! Çözümünüz bana 2 gün sonra (Visual Studio 2010 Net 4, Oracle 10g istemcim var) iş fikri veriyor ... GAC'yi görüyorum ve elbette 3 sürüm Oracle.DataAccess.dll yükledim, hepsini unistalled (ve "DbProviderFactories" içindeki geçersiz machine.config anahtarlarını silin) ​​ve yalnızca ODAC1120320 x64'ü yeniden yükleyin. Ve çalışıyor.
Hernaldo Gonzalez

5

ODP.Net hedef makineye yükleyin ve sorunu çözmelidir ... dll's kopyalamak iyi bir fikir görünmüyor ...


5

Oracle 11g (11.1.0.7.20) için Exe ile birlikte aşağıdaki dll'leri eklemek zorunda kaldım.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (30mb'ye yakın oldukça büyük)
  4. Oracle.DataAccess.dll

130 MB
Elmue

2

Bana öyle geliyor ki, Oracle Istant Client ile ODP'niz olsa da, ODP bunun yerine gerçek Oracle Client'ı kullanmaya çalışıyor olabilir. Makinede standart bir Oracle istemciniz var mı? Oracle'ın aynı makinede birden fazla istemciye geldiğinde oldukça seçici olduğunu hatırlıyorum.


2

Ben de aynı problemi yaşadım. Uygulamayı derledikten sonra oraociei11.dll'yi sildim (ve sildiğimi unuttum). Ve yürütmeye çalışırken bu hatayı veriyordu. Yani oraociei11.dll dll bulamadığında, bu hatayı gösterir. Bu hatayı verdiği başka durumlar da olabilir, ancak bu bunlardan biri gibi görünüyor.


2

Ayrıca IIS Uygulama havuzunu arayın 32 bit doğru veya yanlış bayrağını etkinleştirin, bu mesajı gördüğünüzde bazı oracle forumları beni bunun için yönlendirdi!


2

aynı sorun var ama benim durumumda sadece bin klasörüne dll kopyalamak olamaz, o zaman ben sadece 'montaj sürümü yeniden.

<?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

İşte 3 saat boyunca devam eden bu sorunu çözmek için yaptım:

  1. Oracle home adresinde , daha önce Windows 64 bit için bit yüklediğim C:\oracle\product\11.2.0adlı bir klasör client_1vardı ODP.NET.

  2. Daha sonra ASP.NET Web API uygulamamı Visual Studio 2012 ile hata ayıklamaya çalışırken, bu hata iletisini almaya devam ettim: Sağlayıcı Oracle istemcisi sürümüyle uyumlu değil .

  3. Google'da arama yapıyorum, bunun ODP.NET64 bit kullandığım için olduğunu fark ettim . Sonra ODP.NETWindows 32 bit için yakaladım ve yükledim ama aynı hata mesajını almaya devam ettim.

  4. ÇÖZÜM: klasörü sildi client_1ve ODP.NET32 bit'i yeniden yükledi . Bir şekilde yükleyici 64 bit versiyondan 32 bit versiyonla bitleri karıştırıyordu. Şekle git ...

  5. Şimdi tekrar mutluyum ve yeni bir tane açabiliyorum OracleConnection. EN SONUNDA! :)


2

Hala bu sorunu yaşayan herkes için: bu makaleye dayanarak

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

Sunucum Microsoft C ++ Visual Runtime Library eksik olduğunu öğrendim - Visual Studio yüklü nedeniyle dev makinemde vardı. Kütüphanenin (şu an) en son sürümünü buradan indirip yükledim:

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

Kurulum koştu ve C # oracle çağrısı yaptı!


1
Dostum ... Oracle .... biraz tartışabilir miyiz? Buraya gel, köşeye. Dinle adamım, bütün gün geçirdim, "sağlayıcı uyumlu değil" ne demek istediğini anlamaya çalıştım, ancak daha sonra bazı kurulum bağımlılığının karşılanmadığı için. Hayır - - Ben Lütfen talep Eğer yükleyici yapmak çeki kurulum sırasında bu bağımlılıklar için ve kullanıcıyı uyarmak bunun yerine getirilmediği takdirde. Teşekkürler.
Jay Sullivan

3
Bu arada, birden fazla kez bu yığın akışı sorusuna geri dönmek zorunda kaldım ve her seferinde benim için farklı bir cevap geçerli. Bu ne zaman ve para kaybıdır.
Jay Sullivan

2

TLDR Sürümü:

  • Bunun yerine 12c % 100 yönetilen sağlayıcıyı kullanın.
  • Eski sağlayıcıyı kullanmanız gerekiyorsa, Oracle.DataAccess.dll dosyasını doğru sürümdeki yönetilmeyen Oracle Client Dll'lere yönlendirmeniz gerekir. Makinenizde, uygulama yapılandırmanıza "DllPath" yapılandırma değişkenini (aşağıya bakın) dahil etmek gibi basit bir şekilde yüklenmiş birden fazla Oracle İstemciniz varsa, ancak işaret etmek için yeni bir oracle istemcisi yüklemeniz gerekebilir.

Tam versiyon:

İlk olarak, eski değiştirilmemiş sağlayıcının bileşenlerini anladığımızdan emin olalım (yeni 12c% 100 yönetilen sağlayıcı değil). İki parçadan oluşur:

  1. .net bileşeni - Oracle.DataAccess.dll
  2. yönetilmeyen (non.net) istemci

Basitçe söylemek gerekirse, Oracle.DataAccess.dll .net komutlarını yönetilmeyen istemci için ORACLE-NET komutlarına çeviren neredeyse sadece bir sarıcıdır.

Oracle.DataAccess yüklediğinizde, gereken yönetilmeyen istemci dll'leri bulmaya çalıştığı bir sipariş olduğunu söyledi. Gönderen Oracle Belgeleri :

Oracle.DataAccess.dll, aşağıdaki sıraya göre bağımlı yönetilmeyen yönetilen DLL'leri (Oracle Client gibi) arar:

1. Uygulamanın veya yürütülebilir dosyanın dizini.

Uygulama yapılandırma veya web.config tarafından belirtilen 2.DllPath ayarı.

3. machine.config tarafından belirtilen DllPath ayarı.

Windows Kayıt Defteri tarafından belirtilen 4.DllPath ayarı.

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ sürüm \ DllPath

Windows PATH ortam değişkeni tarafından belirtilen dizinler.

Bu durumda, uygulamanız yukarıdaki bu işlemi izledi ve kullandığınız Oracle.DataAccess.dll derlemesine göre çok eski yönetilmeyen dll'lere sahip bir yol buldu.

Bu makinede tek Oracle Client kurulumu çok eski olabilir. Ancak, makineye birden fazla istemciniz yüklüyse ve yönetilmeyen dosyalar önce farklı ama eski bir yüklemede bulunursa bu devreye girer. Daha sonra yapılacak basit şey, yapılandırmanızdaki dllPath yapılandırma değişkenini kullanmak ve doğru Oracle Home Bin klasörüne yönlendirmektir:

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

Istemcinin yeni bir kopyasını yüklemek istiyorsanız, xcopy sürümü en küçük ve "anlık istemci" içerir ve yukarıdaki DllPath bu yeni konuma işaret. Ancak herhangi bir oracle istemci kurulumu işe yarayacaktır.

Ancak tüm bu yönetilmeyen istemci çözümlemelerinden kaçınmak istiyorsanız, uygulamanızı% 100 yönetilen sağlayıcıyı kullanacak şekilde güncelleyip güncelleyemeyeceğinize bakın - yönetilmeyen dosyalara bağımlı olmadan sadece bir veya iki yönetilen derlemedir.

Hem bin dizininizde hem de GAC'nizde yüklü olduğunu düşündüğünüz Oracle.DataAccess.dll dosyasını yüklememeniz de mümkündür, ancak bunun daha az olası senario olduğunu düşünüyorum. Daha fazla bilgi için montaj çözüm sürecine bakın .


1

IIS / IWAM kullanıcısının Oracle dizininde izinleri var mı? Bu veri kaynağına Excel veya Access gibi başka bir uygulama kullanarak bağlanabiliyor musunuz?


1

Bir ağ paylaşımındaki Oracle.Data.dll derlemesi DBA'larımız tarafından güncellendiğinden, aynı sorunu yaşadık. Referansı projeden kaldırmak ve tekrar eklemek sorunu çözdü.


1

Bu sorunu çözmek için sadece iki adım.

  1. uygulama havuzu ayarına ilerleyin ve '32 bit Uygulamayı Etkinleştir' bayrağını True olarak ayarlayın.
  2. Kutunuzdaki tüm Dll'lerin 32 bit sürümü olduğundan emin olun ...

iyi şanslar.


@ mazhar-abbas, pls yapabilir misiniz. '32 bit uygulamayı etkinleştir?' IIS veya Project'te mi?
hiFI

1

Yeni DLL alma yolunda gitmedim. Mükemmel bir şekilde çalışan bir sürü mevcut projemiz vardı ve bana sadece baş ağrısını veren sadece yeni projemdi, bu yüzden başka bir şey denemeye karar verdim.

Projem Oracle.DataAccess.dll bağlı dahili olarak geliştirilmiş bir Internal.dll kullanıyordu v4.112.3.0. Herhangi bir nedenle, yayımlama sırasında, Visual Studio v4.121.0.0, yapılandırma dosyalarının hiçbirinde açıkça belirtilmese de, her zaman yüklenir . Bu yüzden bir hata alıyordum.

Yani yaptığım şey:

  1. Başarılı bir şekilde çalışan projelerden bir tanesi web sitemin /bin(sadece güvenli tarafında olmak) kopyaladı.
  2. Oracle.DataAccess.dll başarıyla çalışan projelerden biri benim web sitesine kopyaladı /bin.
  3. Web sitemden her ikisine de Referans Ekle.
  4. Sonunda Oracle.DataAccess referansı geldi myWebSite.csproj, ancak yanlış sürümü gösterdi: v4.121.0.0yerine v4.112.3.0.
  5. Referansı manuel olarak değiştirdim, myWebSite.csprojşimdi okudum:

    <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
Bu bir var gerçekten bir depo klasörü dlls bir başvuru eklemek için kötü bir fikir.
Jay Sullivan

1
binVe objklasörler şunlardır çıktı klasörler; Bu, projenizi oluştururken dll'lerin gittiği yerdir. Çakışma oluşturmadan bu klasörleri istediğiniz zaman silebilirsiniz. Genellikle bu klasörler kaynak denetiminde yoksayılır . Standart uygulama, External Referencesbaşvurulan dll'leri koyacağınız bir klasör oluşturmaktır .
Jay Sullivan

@notfed Haklısın. Bunu aklımda tutacak.
Robotron

Adlandırıldığı gibi, derleyici için bir ipucu yoludur, bir zorlama başvurusu değildir. Önce GAC, Oracle.DataAccess.dll dosyasını arar. Tamamen silseniz bile çalışmalıdır HintPath.
Wernfried Domscheit

1

Visual Studio 2015 için Oracle Veri Araçları'nı yükledikten ve sonra iyi bir saat boyunca Oracle ile savaştıktan sonra bu sorunla karşılaştım. Dosya kopyalama, yapılandırma değişiklikleri, vb. İle bu karışıklık yerine Oracle istemcisini yeniden yüklemeye karar verdim ve bu benim için çalıştı.


1

Benzer bir sorunla karşılaştım ve kök neden GAC'nin 2 oracle.dataaccess sürümüne sahip olmasıydı: v4.0_4.112.2.0 ve v4.0_4.112.4.0. Uygulamam v4.0_4.112.2.0'a atıfta bulundu, bu yüzden v4.0_4.112.4.0'ı GAC'den kaldırdığımda iyi çalıştı.

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

Önce : resim açıklamasını buraya girin

Sonra: resim açıklamasını buraya girin

Bir sürümü kaldırmak için ilgili klasörü GAC'den silebilirsiniz.


0

Son zamanlarda çözümün ve içerdiği tüm projelerin x32 platformuna hedeflendiği daha eski bir proje üzerinde çalışmak zorunda kaldım. Oracle.DataAccess.dll ve diğer tüm önerilen Oracle dosyalarını her yerde kopyalamaya çalıştım, ancak her seferinde duvara çarptım. Sonunda kafadaki ampul yandı (8 saat sonra :)) ve kurulu ODAC montajlarını ve platformlarını kontrol etmelerini istedi. Tüm 64 bit (x64) ODAC istemcilerini zaten yükledim, ancak 32 bit olanları (x32) yüklemedim. 32-bit ODAC yüklendi ve sorun kayboldu.

Yüklü ODAC sürümü nasıl kontrol edilir: C: \ Windows \ assembly klasörüne bakın. "İşlemci Mimarisi" özelliği kurulu ODAC platformunu bilgilendirecektir.

Ampulün yanması sekiz saattir. İşe her zaman atmak zorunda kalmama şaşmamalı :).


Not, C:\Windows\assembliessadece .NET framework sürüm 2.0'a kadar olan montajları gösterir. Sürüm 3.x / 4.x görüntülenmez, bkz. Stackoverflow.com/questions/28213105/…
Wernfried Domscheit

0

Chris'in çözümü de benim için çalıştı. Ancak bildiren bir takip hata mesajı aldım:

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.

Görünüşe göre, Oraclish'in yabancı dilinde, programınızın tüm platformları veya 32 bit makineleri hedeflediği anlamına gelir. Proje Özellikleri'ndeki hedef platformunuzu 64 bit olarak değiştirin ve en iyisini umun.


3
Aslında .NETish, Oraclish değil
Jay Sullivan

0

Oracle.DataAccess.dll v4.121.2.0 ile aynı sorunu vardı. 2 ev kurulumlu (32 ve 64 bit versiyonlar). 32-bit sürümü workerd, 64-bit sürümü yoktu.

Benim durumumda (2 gün denedikten sonra), sorunun 64 bit ev sürümünde izinler olduğunu buldum. Bu sürümdeki birçok Dizin , "Kimliği Doğrulanmış Kullanıcılar" rolünün üst dizinde varsayılan olarak ayarlanan "Okuma" erişimine sahip olmadığı özel olarak geçersiz kılınmış izinlere sahipti. Bu alt dizinler arasında "bin", "network / admin", "nls", "oracore", "RDBMS" ve muhtemelen diğerleri vardı. Ben "ACCESS DENIED" sonucu sysinternals "Process Monitor" (Procmon.exe) yardımcı programı filtreleyerek buldum. İzinler üst dizinden bu alt alt dizinlere devralındıktan sonra her şey çalışmaya başladı.

Tüm oracle evindeki izinleri geçersiz kılmak için ne yapmadım, bu yüzden onları her seferinde bir dizin yaptım, ancak güvenlik hakkında endişelenmezseniz, ilgili tüm oracle ana dizininde sıfırlayabilirsiniz.



-3

Burada birçok teorik cevap var, ancak burada hemen kopyalayıp yapıştırabileceğiniz ve test edebileceğiniz kod içeren bir çalışma örneği geliyor:

  1. Önceden yüklenmiş bazı demo tablolarıyla birlikte gelen Oracle Express veritabanı OracleXE112'yi kurdum .
  2. Yükleyiciyi başlattığınızda bir parola girmeniz istenir . Şifre olarak "xxx" girdim. (üretimde kullanılmaz)
  3. Sunucum makinede çalışıyor 192.168.1.158
  4. Sunucuda, Windows Güvenlik Duvarı'ndaki TNSLSNR.exe işlemi için erişime açık bir şekilde izin vermelisiniz . Bu işlem 1521 numaralı bağlantı noktasını dinler. Aşağıdaki koddan zaman aşımı hatası alırsanız güvenlik duvarınızı kontrol edin.
  5. SEÇENEK A: C # (.NET2 veya .NET4) için, Oracle.DataAccess.dll dosyasını projenize eklemeniz gereken ODAC11'i indirebilirsiniz. Ayrıca bu DLL bağlıdır: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Bu DLL dosyaları EXE ile aynı dizinde olmalı veya DLL yolunu: olarak belirtmelisiniz HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. 64 bit makinelerde ayrıcaHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. B SEÇENEĞİ: Eğer indirdiyseniz ODAC12 Eğer Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (! 160MB), oraons.dll, msvcr100.dll gerekir. Kayıt defteri yoluHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. SEÇENEK C: 100 MB'den büyük dev DLL'ler istemiyorsanız Oracle.ManagedDataAccess.dll, sadece 4 MB ve 32 bit ve 64 bit işlemlerde çalışan saf yönetilen bir DLL olan ODP.NET_Managed12.xxxxxxxx.zip dosyasını indirmelisiniz. ve diğer DLL'lere bağlı değildir ve herhangi bir kayıt defteri girdisi gerektirmez.
  8. Aşağıdaki C # kodu sunucu tarafında herhangi bir yapılandırma yapmadan benim için çalışıyor (sadece varsayılan kurulum):
Oracle.DataAccess.Client kullanarak;
veya
Oracle.ManagedDataAccess.Client kullanarak;

....

string oradb = "Veri Kaynağı = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOKOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SUNUCU = BELGE)));"
    + "Kullanıcı Kimliği = SİSTEM; Şifre = xxx;";

kullanarak (OracleConnection conn = yeni OracleConnection (oradb)) 
{
    conn.Open ();
    (OracleCommand cmd = yeni OracleCommand ()) kullanarak
    {
        cmd.Bağlantı = conn;
        cmd.CommandText = "DBA_DATA_FILES arasından TABLESPACE_NAME seçin";

        (OracleDataReader dr = cmd.ExecuteReader ()) kullanarak
        {
            while (dr.Okuma ())
            {
                ListBox.Items.Add (dr [ "tablespace_name"]);
            }
        }
    }
}

Yalnızca çalışan bir istemciye ihtiyacınız olduğunda tüm Oracle veritabanı sunucusunu yüklemek için aşırı bir overkill.
Wernfried Domscheit

Cevap zaten zayıf. Herhangi bir Oracle dll "nin uygulama dizinine kopyalanmasına gerek yoktur, çünkü varsayılan kurulumda bunları ‰ PATH% (kendiniz değiştirmediğiniz sürece) aracılığıyla bulabilirsiniz. Kayıt ipucu yalnızca for.version 4.x için geçerlidir ve yalnızca . 32 bit Oracle istemci Ancak mismatchrs 32 bit vs 64 bit Bu sorunun ana konudur.
Wernfried Domscheit

Yorumunuz cevabımı okumadığınızı gösteriyor. Bir Oracle sunucusuyla iletişim kuran bir uygulama yazmak istersem, Oracle'dan herhangi bir şey yüklemenize gerek yoktur. Ben sadece yukarıda belirtilen DLL kullanın ve benim uygulama ile dağıtın. Dolayısıyla, son kullanıcının makinesindeki PATH değişkeninde hiçbir şey olmayacaktır. Bu arada (1980'den itibaren eski DOS çağından gelen) PATH değişkenini kullanmak, modern yazılımda son derece kullanımdan kaldırılmıştır. Cevabım, herhangi bir kayıt defteri yoluna ihtiyaç duymayan ve 32 veya 64 bit'e bağlı olmayan SEÇENEK C'yi önerir. SEÇENEKLER A ve B'den sadece bütünlük için bahsettim.
Elmue

Ben uygun%% PATH% ayarı olmadan Windows hiç işe yaramaz düşünüyorum - hatta 10 sürümünde. Cevabımda herhangi bir Oracle dll uygulama ile el ile kopyalamak akıllı olmadığını belirtti. Bu dll en kaynak kodunu bilmiyorum ama görmüyorum müşteri tarafında daha fazla bağımlılık olabilir, örneğin dil ayarları, karakter kümeleri, saat dilimi, vb tarafından tetiklenir Oracle.DataAccess.dll. program toplam 35 Oracle DLL yükler! Tabii ki ODP.NET Yönetilen sürücüsünü kullanmıyorsanız, Oracle Client'ın normal kurulumunu daha iyi yapın.
Wernfried Domscheit

1
Sanırım endişelerimden bahsetmiştim: (1) Bir veritabanı kurmak işe yaramaz, yani aşırıya kaçmak. (2) Seçenek A ve B yalnızca belirli koşullar altında çalışır, örneğin Kayıt Defterinden herhangi bir NLS Ayarını okumaz (dosyaya ihtiyacınız vardır oracle.key). Uyumluluk için küçük sürümleri de dikkate almanız gerekir. Oracle.DataAccess, Version=2.112.2.0çalışmaz OraOps11w.dllörneğin sürümü 2.112.4.0.
Wernfried Domscheit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.