Dostawca nie jest zgodny z wersją klienta Oracle

157

Próbuję użyć klienta błyskawicznego Oracle ODP.NET 11g (11.1.0.6.20) w moim projekcie ASP.net jako dostawcy danych, ale po uruchomieniu strony aspx pojawia się komunikat „ Dostawca nie jest zgodny z wersją klienta Oracle ”. Każda pomoc będzie mile widziana.

Odwołałem się do dostawcy danych w programie Visual Studio 2005, a kod za nim wygląda następująco:

using Oracle.DataAccess.Client;
..

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

//Do Something

oOracleConn.Close();

Błąd strony wygląda następująco:

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
źródło

Odpowiedzi:

91

Przyjrzałem się temu problemowi dalej i po prostu musisz pobrać wszystkie odpowiednie biblioteki DLL z tej samej pobranej wersji ODP.Net i umieścić je w tym samym folderze co plik Exe, ponieważ ODP.Net jest wybredny, jeśli chodzi o nie mieszanie numery wersji.

Wyjaśniłem, jak to zrobić, tutaj: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Oto sedno tego:

  • Pobierz ODP.Net
  • Rozpakuj plik
  • Rozpakuj wszystkie zawarte w nim pliki JAR
  • Pobierz te biblioteki DLL, które zostały właśnie rozpakowane:
    • oci.dll (nazwa zmieniona z „oci.dll.dbl”)
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (nazwa zmieniona z „ociw32.dll.dbl”)
  • Umieść wszystkie biblioteki DLL w tym samym folderze, co plik wykonywalny C #
Chris
źródło
4
Twoje rozwiązanie zadziałało dla mnie - znalazłem post na blogu, zanim go znalazłem. Jesteś meżczyzną. Dzięki! :-) Ponadto, używając najnowszej wersji ODAC, nie musiałem rozpakowywać żadnego z plików JAR ... pliki .dll znajdowały się w różnych katalogach w moim domu oracle. Proste wyszukiwanie w Windows bardzo szybko je pokazało.
Pandincus
10
Ponadto używałem najnowszej wersji ODAC (11.2.0.1.2) na moim komputerze deweloperskim, a jedyne potrzebne pliki to: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Jak wskazuje Chris, UPEWNIJ SIĘ, ŻE SĄ W TYM SAMYM FOLDERZE, CO TWÓJ WYKONYWANY. ;-)
Pandincus
1
Wygląda na to, że nowsza wersja ułatwia znajdowanie bibliotek dll. Wspaniały! A teraz, ile czasu minie, zanim wyrocznia umieści je w jednym prostym pliku dll ...
Chris
Strategia Chrisa i zestaw biblioteczny Pandincusa zadziałały dla mnie. Wywołuję klienta Oracle przez PowerShell, więc umieściłem bibliotekę w katalogu wykonywalnym PowerShell.
quillbreaker
1
W dzisiejszych czasach prawdopodobnie powinieneś używać sterownika zarządzanego C #, jeśli możesz :)
Chris
47

Powinieneś "zignorować" całą rozmowę x86 / x64 na początek i zamiast tego wypróbuj zarządzany sterownik ODP.NET (jeśli używasz .Net v4 +):

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

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

Oracle ODP.net Managed vs Unmanaged Driver

Unikaj wszystkich "niezarządzanych" problemów związanych z bibliotekami DLL! : D (o czasie Oracle).

Pakiet NuGet (działa również dla 11g):

wprowadź opis obrazu tutaj

Stara / ręczna metoda:

Aby uzyskać informacje na temat konwertowania do korzystania z bibliotek zarządzanych :

  • Po pierwsze, oto świetne porównanie kodu zarządzanego i niezarządzanego : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Upewnij się, że pobrałeś tylko wersję ODP.NET, Managed Driver Xcopy
  • Z pobranego pliku zip skopiuj i wklej do katalogu projektu:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Dodaj odwołanie do Oracle.ManagedDataAccess.dll
  • Upewnij się, że Twój exe jest wydany (dodany do folderu aplikacji w VS2010) z obydwoma bibliotekami DLL
Tod Thomson
źródło
3
Dobra wiadomość, że Oracle wreszcie ma w pełni zarządzany sterownik. Noszenie tego 100mb dll było prawdziwym obciążeniem.
Jafin
1
zarządzany sterownik działa dla mnie świetnie - nie miałem problemu od czasu przejścia na niego / możesz ustawić swoje projekty z powrotem na AnyCPU itp. i działa świetnie :)
Tod Thomson
5
Wszyscy wiedzą, że chociaż zarządzany dostawca jest miły, brakuje mu wielu funkcji, na które pozwala pełny dostawca. Mianowicie wbudowane szyfrowanie Oracle.
Justin Skiles,
1
Dokumentacja Oracle jest co najmniej „rozproszona”. Oto dobre łącze do niektórych nieobsługiwanych metod . Dodatkowo sam sterownik jest wyposażony w oznaczenie, readmektóre określa pewne ograniczenia.
Justin Skiles
2
Wykorzystanie zarządzanego sterownika to ostateczne rozwiązanie! Mam za każdym nitghtmare myślę cały czas spędzony kiedy miałem niezgodność typów
Ettore ct
35

Zainstalowałem tylko dostawcę danych Oracle dla .NET 2.0 (11.1.0.6.20) i nie zainstalowałem Oracle Instant Client (11.1.0.6.0) .

Właśnie go zainstalowałem i błąd zniknął!

EverTheLearner
źródło
3
Czy zamiast instalować klienta, możesz po prostu skopiować 4 biblioteki DLL klienta błyskawicznego do tego samego folderu co plik EXE? (te pliki: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris
2
@Chris: Tak, możesz. Z mojego doświadczenia wynika jednak, że potrzebujesz oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll i oracle.dataaccess.dll
Pakman
Odwrotnie - zainstalowałem klienta, ale nie dostawcę
Ev.
33

Może to być spowodowane uruchomieniem 64-bitowego środowiska uruchomieniowego .NET na 32-bitowym kliencie Oracle. Może się to zdarzyć, jeśli na serwerze uruchamiasz aplikację 64-bitową. Uruchomi aplikację .NET w 64-bitowym środowisku wykonawczym. Możesz ustawić flagę procesora w projekcie w programie VS, aby działał w 32-bitowym środowisku wykonawczym.

Daniel
źródło
Właśnie wpadłem na ten. Pracował w (32-bitowej) aplikacji testowej, a następnie przewrócił się w usługach IIS. Zamiast wymagać, aby wszystkie zaangażowane zestawy były 32-bitowe, zmieniłem na 32-bitową pulę aplikacji.
anton.burger,
22

Zróbmy jakieś podsumowanie:

Komunikat o błędzie „Dostawca nie jest zgodny z wersją klienta Oracle” może mieć kilka przyczyn.

  • Nie masz zainstalowanego klienta Oracle. W takim przypadku komunikat o błędzie rzeczywiście wprowadza w błąd.

    Oracle Data Provider for .NET (ODP.NET, tj. Plik Oracle.DataAccess.dll) nie jest zawarty w Oracle Instant Client, należy go zainstalować oddzielnie (pobrać z 32-bitowych składników Oracle Data Access Components (ODAC) lub 64-bitowych Oracle Data Access Components ( ODAC) ) lub wybierz odpowiednią opcję w programie Oracle Universal Installer (OUI).

    Uwaga: podczas instalowania dostawcy danych Oracle> = 12.1 dostawca nie jest automatycznie rejestrowany w GAC. W razie potrzeby należy zarejestrować go ręcznie, patrz Oracle Doc 2272241.1 .

  • Wersja ODP.NET nie odpowiada zainstalowanej wersji klienta Oracle. Musisz sprawdzić nawet pomocniczy numer wersji! Na przykład Oracle.DataAccess.dllwersja 4.112.3.0 nie jest zgodna z klientem Oracle 11.2.0.4 . Dokładnie sprawdź wersje ODP.NET i Oracle Client. Możesz użyć sigcheck na oraociei*.dlli / lub w OraOps*w.dllcelu pobrania wersji klienta Oracle.

    Pamiętaj o innym schemacie numeracji. Wersja pliku 4.112.3.0 środki: .NET Framework w wersji 4, Oracle Release 11.2.0.3.x .

    Istnieją wersje ODP.NET „1.x”, „2.x” i „4.x”. Numery te dotyczą wersji Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 i 4.0.30319. Wersja „1.x” była dostępna do Oracle Client 11.1. Wersja „4.x” została wprowadzona wraz z Oracle Client 11.2

  • Architektura (32- lub 64-bitowa) ODP.NET nie odpowiada architekturze Twojej aplikacji. Aplikacja 32-bitowa działa tylko z 32-bitowym klientem Oracle / ODP.NET, odpowiednio aplikacja 64-bitowa wymaga 64-bitowego klienta Oracle / ODP.NET. (O ile nie używasz zarządzanego sterownika ODP.NET )

  • Wersja .NET Framework nie jest zgodna. Na przykład, jeśli kompilujesz aplikację z docelowym .NET Framework 2.0, nie możesz używać ODP.NET w wersji 4.x. Wersja docelowa .NET Framework musi być równa lub wyższa niż wersja ODP.NET.

  • Wersja programu Oracle.DataAccess.dllna komputerze deweloperskim (tj. Wersja ładowana podczas kompilacji) jest wyższa niż wersja na komputerze docelowym.

  • Należy pamiętać, że Oracle.DataAccess.dllmoże zostać załadowany z GAC, który domyślnie ma pierwszeństwo przed dowolnym plikiem dostarczonym lokalnie.

Rozwiązania

  • Rozważ użycie zarządzanego sterownika ODP.NET, który można pobrać ze strony Oracle: Pobieranie 64-bitowych składników Oracle Data Access Components (ODAC) . Tam musisz tylko skopiować Oracle.ManagedDataAccess.dllplik do katalogu aplikacji, nic więcej nie jest wymagane. Działa zarówno dla wersji 32-bitowej, jak i 64-bitowej.

  • W twoim *.csproj, resp. *.vbprojedytuj swoje odniesienie do ODP.NET w ten sposób:

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

    Atrybuty takie jak Version=...lub processorArchitecture=...nie są wymagane. Twoja aplikacja załaduje się poprawnie w Oracle.DataAccess.dllzależności od wybranej architektury i docelowego środowiska .NET Framework (pod warunkiem, że jest poprawnie zainstalowana) -> nie w 100% zweryfikowana

  • W przypadku, gdy nie znasz wersji Oracle Client na komputerze docelowym (np. Może to być maszyna Twojego klienta): Przejdź do wspomnianej powyżej strony pobierania i pobierz najmniejszą wersję XCopy składników Oracle Data Access Components. Rozpakuj Oracle.DataAccess.dllplik zip i skopiuj tylko plik na komputer lokalny. W swoim projekcie VS odwołaj się do tej (najprawdopodobniej nieaktualnej) biblioteki DLL. Wersja tej biblioteki DLL to najmniejsza wersja ODP.NET, z którą będzie współpracować Twoja aplikacja. Po uruchomieniu aplikacji zasady wydawcy w GAC przekierują do faktycznie zainstalowanej wersji.

  • Nie sądzę, aby mądrze było wziąć pojedyncze pliki DLL i skopiować je do określonych folderów. Może działać na „czystej” maszynie, ale jeśli na komputerze docelowym zainstalowano jakiekolwiek produkty Oracle, istnieje wysokie ryzyko niezgodności wersji. Odinstaluj wszystkie produkty Oracle ze swojego komputera i wykonaj nową instalację. Zobacz Jak odinstalować / całkowicie usunąć Oracle 11g (klient)? aby uzyskać naprawdę czystą maszynę.

  • Jeśli musisz pracować jednocześnie z aplikacjami 32-bitowymi i 64-bitowymi, postępuj zgodnie z poniższą instrukcją, aby zainstalować obie wersje na jednym komputerze:

Założenia: nazywa się Oracle Home OraClient11g_home1, wersja klienta to 11gR2.

  • Opcjonalnie usuń dowolnego zainstalowanego klienta Oracle

  • Pobierz i zainstaluj klienta Oracle x86, na przykład w C:\Oracle\11.2\Client_x86

  • Pobierz i zainstaluj klienta Oracle x64 w innym folderze, na przykład w C:\Oracle\11.2\Client_x64

  • Otwórz narzędzie wiersza poleceń, przejdź do folderu% WINDIR% \ System32, zazwyczaj C:\Windows\System32i utwórz symboliczne łącze ora112do folderu C:\Oracle\11.2\Client_x64(patrz poniżej)

  • Przejdź zwykle do folderu% WINDIR% \ SysWOW64 C:\Windows\SysWOW64i utwórz symboliczne łącze ora112do folderu C:\Oracle\11.2\Client_x86(patrz poniżej)

  • Zmodyfikuj PATHzmienną środowiskową, zamień wszystkie wpisy, takie jak C:\Oracle\11.2\Client_x86i C:\Oracle\11.2\Client_x64przez C:\Windows\System32\ora112, w odpowiednich \binpodfolderach. Uwaga: C:\Windows\SysWOW64\ora112nie może znajdować się w środowisku PATH.

  • W razie potrzeby ustaw ORACLE_HOMEzmienną środowiskową yor naC:\Windows\System32\ora112

  • Otwórz Edytor rejestru. Ustaw wartość rejestru HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEnaC:\Windows\System32\ora112

  • Ustaw wartość rejestru HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEna C:\Windows\System32\ora112(nie C:\Windows\SysWOW64\ora112)

  • Gotowe! Teraz możesz używać klienta Oracle x86 i x64 bezproblemowo razem, tj. Aplikacja x86 załaduje biblioteki x86, aplikacja x64 ładuje biblioteki x64 bez dalszej modyfikacji w systemie.

Polecenia do tworzenia dowiązań symbolicznych:

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

Kilka uwag:

  • Oba dowiązania symboliczne muszą mieć tę samą nazwę, np ora112.

  • Jeśli chcesz później ręcznie zainstalować ODP.NET, zadbaj o wybranie odpowiednich folderów do instalacji.

  • Pomimo ich nazw folder C:\Windows\System32zawiera biblioteki x64, natomiast C:\Windows\SysWOW64zawiera biblioteki x86 (32-bitowe). Nie daj się zmylić.

  • Może na przykład rozsądną opcją jest ustawienie TNS_ADMINzmiennej środowiskowej (lub TNS_ADMINwpisów w rejestrze) na wspólną lokalizację TNS_ADMIN=C:\Oracle\Common\network.

Wernfried Domscheit
źródło
Ta IMO ma więcej wiedzy do odebrania niż rzeczywista odpowiedź. Więc jeśli mam aplikację x86 dla .net 4, a wersja bazy danych to 9i, to jaką wersję klienta potrzebuje użytkownik, jeśli ma 32- lub 64-bitowy system Windows? Oracle twierdzi, że każda wersja klienta jest zgodna z dowolną wersją bazy danych. Czy w przypadku użytkowników 32-bitowych można zainstalować wersję 32-bitową, a użytkownicy 64-bitowi - wersję 64-bitową i użyć zarządzanego sterownika ODP.NET, aby zdecydować, z którym systemem operacyjnym się komunikuje?
Luminous
1
Kiedy używasz zarządzanego sterownika ODP.NET, nie jest wymagana instalacja żadnego klienta Oracle - to jest jego główna zaleta. Działa z aplikacjami x86 i x64. Bez „zarządzanego sterownika ODP.NET” aplikacja x86 wymaga również klienta Oracle x86 (tj. 32-bitowego), niezależnie od architektury serwera bazy danych.
Wernfried Domscheit
Właśnie natknąłem się na informację „Należy zainstalować pakiet redystrybucyjny Microsoft Visual C ++ 2010” - należy to dodać do podsumowania.
Jay Sullivan
1
Nie sądzę, że ten błąd jest związany lub spowodowany przez Oracle lub ODP.NET
Wernfried Domscheit
U mnie działa, instaluję Oracle.DataAccess.dllz pakietu nuget Oracle.DataAccess.x86, a jego wersja Dll jest 2.112.1.0, więc dopasowuję instalację klienta Oracle do wersji Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) TUTAJ, a następnie problem rozwiązany!
yu yang Jian
6

Po kilku godzinach rozwiązywania problemów stwierdziłem, że przyczyną tego problemu jest posiadanie pliku Oracle.DataAccess.dll (v4.0) w katalogu bin moich projektów, ale środowisko wykonawcze również ładuje Oracle.DataAccess.dll (v2.x) z GAC. Usunięcie i odczytanie wpisu Oracle.DataAccess w referencjach projektu rozwiązało problem.

Inne wymienione tutaj pliki nie okazały się potrzebne w mojej sytuacji.

AKTUALIZACJA

Główną przyczyną błędu „Dostawca nie jest zgodny z wersją klienta Oracle” jest (ogólnie) to, że zarządzany zestaw próbuje załadować niezarządzane biblioteki, które nie są zgodne z wersjami. Wygląda na to, że możesz zmusić sterownik Oracle do używania poprawnych bibliotek, określając ścieżkę do biblioteki w pliku web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
psaxton
źródło
Dzięki! Twoje rozwiązanie daje mi wyobrażenie, że działa po 2 dniach (mam Visual Studio 2010 Net 4, klient Oracle 10g) ... Widzę GAC i oczywiście zainstalowałem 3 wersje Oracle.DataAccess.dll, odinstalowałem wszystkie (i usuń nieprawidłowe klucze machine.config w „DbProviderFactories”) i ponownie zainstaluj tylko ODAC1120320 x64. I to działa.
Hernaldo Gonzalez
5

zainstaluj ODP.Net na maszynie docelowej i powinno rozwiązać problem ... kopiowanie bibliotek dll nie wygląda na dobry pomysł ...

HainKurt
źródło
5

W przypadku Oracle 11g (11.1.0.7.20) musiałem dodać następujące biblioteki DLL wraz z moim Exe do pracy.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (bardzo duże, blisko 30mb)
  4. Oracle.DataAccess.dll
SKG
źródło
Chcesz powiedzieć 130 MB
Elmue
2

Wydaje mi się, że chociaż masz ODP z Oracle Istant Client, ODP może próbować użyć rzeczywistego klienta Oracle. Czy masz również zainstalowanego standardowego klienta Oracle na komputerze? Przypominam sobie, że Oracle była dość wybredna, jeśli chodzi o obsługę wielu klientów na tym samym komputerze.

Peter Meyer
źródło
2

Miałem dokładnie ten sam problem. Usunąłem (i zapomniałem, że usunąłem) oraociei11.dll po kompilacji aplikacji. I dawał ten błąd podczas próby wykonania. Więc kiedy nie może znaleźć dll, że oraociei11.dll, pokazuje ten błąd. Mogą istnieć inne przypadki, w których powoduje ten błąd, ale wydaje się, że jest to jeden z nich.


źródło
2

Poszukaj również puli aplikacji IIS Włącz 32-bitową flagę prawda lub fałsz. Gdy zobaczysz ten komunikat, skierowało mnie do tego forum Oracle!

Hydtechie
źródło
2

Mam ten sam problem, ale w moim przypadku nie mogę po prostu skopiować bibliotek dll do folderu bin, a następnie `` ponownie powiązuję '' wersję zestawu.

<?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
źródło
2

Oto, co zrobiłem, aby rozwiązać ten problem, który trwał przez 3 długie godziny:

  1. W domu Oracle znajdującym się pod adresem C:\oracle\product\11.2.0miałem folder o nazwie, w client_1którym wcześniej zainstalowałem ODP.NETbity dla bitów Windows 64.

  2. Później podczas próby debugowania mojej aplikacji ASP.NET Web API za pomocą programu Visual Studio 2012 ciągle otrzymywałem ten komunikat o błędzie: Dostawca nie jest zgodny z wersją klienta Oracle .

  3. Przeszukując Google stwierdziłem, że dzieje się tak, ponieważ używałem ODP.NET64 bitów. Następnie złapałem ODP.NET32 bity systemu Windows i zainstalowałem go, ale wciąż otrzymywałem ten sam komunikat o błędzie.

  4. ROZWIĄZANIE: usunięto folder client_1i ponownie zainstalowano ODP.NET32 bity. W pewnym stopniu instalator mieszał bity z wersji 64-bitowej z wersją 32-bitową. Domyśl...

  5. Teraz znów jestem szczęśliwy i mogę otworzyć nowy OracleConnection. WRESZCIE! :)

Leniel Maccaferri
źródło
2

Dla każdego, kto nadal ma ten problem: na podstawie tego artykułu

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

Dowiedziałem się, że na moim serwerze brakuje biblioteki Microsoft C ++ Visual Runtime Library - miałem ją na moim komputerze deweloperskim z powodu zainstalowanego programu Visual Studio. Pobrałem i zainstalowałem (obecnie) najnowszą wersję biblioteki stąd:

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

Uruchomiłem konfigurację i wywołanie wyroczni z C # udało się!

dabor
źródło
1
Koleś… Wyrocznia… czy możemy porozmawiać? Chodź tutaj, w rogu. Słuchaj, spędziłem cały dzień na zastanawianiu się, co miał oznaczać ten cholerny „dostawca niezgodny”, ale później dowiedziałem się, że to dlatego, że nie spełniono jakiejś zależności instalacji. Proszę - nie - żądam , aby instalator sprawdzał te zależności w czasie instalacji i ostrzegał użytkownika, jeśli nie są spełnione. Dzięki.
Jay Sullivan
3
Nawiasem mówiąc, wielokrotnie musiałem wracać do tego pytania związanego z przepełnieniem stosu i za każdym razem inna odpowiedź dotyczy mnie. Co za strata czasu i pieniędzy to spowodowało.
Jay Sullivan
2

Wersja TLDR:

  • Zamiast tego użyj 100% zarządzanego dostawcy 12c .
  • Jeśli musisz użyć starego dostawcy, musisz wskazać plikowi Oracle.DataAccess.dll niezarządzane pliki Dll klienta Oracle, które mają odpowiednią wersję. Jeśli na komputerze jest zainstalowanych wiele klientów Oracle, może to być tak proste, jak włączenie zmiennej konfiguracyjnej „DllPath” (patrz poniżej) do konfiguracji aplikacji, ale może być również konieczne zainstalowanie nowego klienta Oracle, który będzie wskazywał.

Pełna wersja:

Najpierw upewnijmy się, że rozumiemy składniki starego niezarządzanego dostawcy (nie nowego, w 100% zarządzanego dostawcy 12c). Składa się z dwóch części:

  1. zarządzany składnik .net - Oracle.DataAccess.dll
  2. klient niezarządzany (non-.net)

Mówiąc najprościej, Oracle.DataAccess.dll jest prawie tylko opakowaniem, tłumaczącym instrukcje .net na instrukcje ORACLE-NET dla niezarządzanego klienta.

To powiedziawszy, podczas ładowania Oracle.DataAccess istnieje kolejność, w której próbuje zlokalizować niezarządzane biblioteki DLL klienta, których potrzebuje. Z dokumentacji Oracle :

Oracle.DataAccess.dll wyszukuje zależne niezarządzane biblioteki DLL (takie jak klient Oracle) na podstawie następującej kolejności:

1. katalog aplikacji lub plik wykonywalny.

2. ustawienie DLLPath określone przez konfigurację aplikacji lub plik web.config.

3. ustawienie DLLPath określone w pliku machine.config.

4. ustawienie DLLPath określone przez rejestr systemu Windows.

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

5. Katalogi określone przez zmienną środowiskową PATH systemu Windows.

W Twoim przypadku aplikacja wykonała powyższy proces i znalazła ścieżkę zawierającą niezarządzane biblioteki DLL, które są zbyt stare w stosunku do używanego zestawu Oracle.DataAccess.dll.

Może się zdarzyć, że jedyna instalacja klienta Oracle na tym komputerze jest za stara. Ale ma to znaczenie, jeśli na komputerze jest zainstalowanych więcej niż jeden klient, a niezarządzane pliki zostały znalezione jako pierwsze w innej, ale starszej instalacji. Jeśli później, prostą rzeczą do zrobienia jest użycie zmiennej konfiguracyjnej dllPath w konfiguracji i skierowanie jej do właściwego folderu Oracle Home Bin:

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

Jeśli chcesz zainstalować nową kopię klienta, wersja xcopy jest najmniejsza i zawiera „klienta błyskawicznego”, a ścieżka DllPath powyżej wskazuje tę nową lokalizację. Ale każda instalacja klienta Oracle będzie działać.

Ale jeśli chcesz uniknąć wszystkich tych niezarządzanych rozwiązań dotyczących klienta, sprawdź, czy możesz zaktualizować aplikację, aby zamiast tego korzystała z dostawcy zarządzanego w 100% - w rzeczywistości jest to tylko jeden lub dwa zestawy zarządzane, bez żadnej zależności od niezarządzanych plików.

Możliwe jest również, że nie ładujesz Oracle.DataAccess.dll, który myślisz, że jesteś, jeśli jest zainstalowany zarówno w katalogu bin, jak i GAC, ale myślę, że jest to mniej prawdopodobne, że senario. Aby uzyskać więcej informacji, zobacz proces rozwiązywania zespołu .

b_levitt
źródło
1

Czy użytkownik usług IIS / IWAM ma uprawnienia do katalogu Oracle? Czy możesz połączyć się z tym źródłem danych za pomocą innej aplikacji, takiej jak Excel lub Access?

DCookie
źródło
1

Mieliśmy ten sam problem, ponieważ zespół Oracle.Data.dll w udziale sieciowym został zaktualizowany przez naszych DBA. Usunięcie odniesienia z projektu i ponowne dodanie go rozwiązało problem.

doekman
źródło
1

Tylko dwa kroki, aby rozwiązać ten problem.

  1. przejdź do zaawansowanych ustawień puli aplikacji i ustaw flagę „Włącz aplikację 32-bitową” na Prawda.
  2. Upewnij się, że wszystkie biblioteki DLL w Twoim Bin są teraz w wersji 32-bitowej ...

powodzenia.

Mazhar Abbas
źródło
@ mazhar-abbas, czy możesz. wskazać, w którym mogę ustawić opcję „Włącz aplikację 32-bitową? Czy jest w usługach IIS czy w programie Project?
hiFI
1

Nie poszedłem na drogę zdobycia nowych bibliotek DLL. Mieliśmy kilka istniejących projektów, które działały doskonale i dopiero mój nowy projekt przyprawiał mnie o ból głowy, więc postanowiłem spróbować czegoś innego.

Mój projekt korzystał z wewnętrznie opracowanego pliku Internal.dll, który był zależny od Oracle.DataAccess.dll v4.112.3.0. Z jakiegoś powodu podczas publikowania program Visual Studio jest zawsze przekazywany v4.121.0.0, mimo że nie został wyraźnie określony w żadnym z plików konfiguracyjnych. Dlatego pojawia się błąd.

Więc co zrobiłem to:

  1. Skopiowałem plik Internal.dll z jednego z pomyślnie uruchomionych projektów do mojej witryny internetowej /bin(na wszelki wypadek).
  2. Skopiowano plik Oracle.DataAccess.dll z jednego z pomyślnie uruchomionych projektów do witryny sieci Web /bin.
  3. Dodaj odnośnik do obu z mojej strony internetowej.
  4. W końcu pojawiło się odwołanie do Oracle.DataAccess myWebSite.csproj, ale pokazało niewłaściwą wersję: v4.121.0.0zamiast v4.112.3.0.
  5. Ręcznie zmieniłem odniesienie w myWebSite.csproj, więc teraz brzmi:

    <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
źródło
2
Dodanie odwołania do bibliotek dll w folderze bin to naprawdę zły pomysł.
Jay Sullivan
1
binI objfoldery są wyjściowe foldery; w tym miejscu znajdują się biblioteki DLL podczas tworzenia projektu. Powinieneś móc usunąć te foldery w dowolnym momencie bez powodowania konfliktu. Zwykle te foldery są ignorowane w kontroli źródła. Standardową praktyką jest utworzenie External Referencesfolderu, w którym umieszczasz biblioteki DLL, do których się odwołujesz.
Jay Sullivan
@notfed Wygląda na to, że masz rację. Będę o tym pamiętać.
Robotron
Jak nazwano, jest to tylko ścieżka wskazująca dla kompilatora, a nie wymuszona referencja. Najpierw GAC jest przeszukiwany pod kątem Oracle.DataAccess.dll. Powinno działać, nawet jeśli HintPathcałkowicie usuniesz plik.
Wernfried Domscheit
1

Napotkałem ten problem po zainstalowaniu Oracle Data Tools for Visual Studio 2015, a następnie dobrej godzinie walki z Oracle. Postanowiłem spróbować ponownie zainstalować klienta Oracle zamiast bałaganu związanego z kopiowaniem plików, zmianami konfiguracji itp. I to zadziałało.

David Spenard
źródło
1

Miałem podobny problem, a główną przyczyną było to, że GAC miał 2 wersje oracle.dataaccess, tj. V4.0_4.112.2.0 i v4.0_4.112.4.0. Moja aplikacja odnosiła się do wersji 4.0_4.112.2.0, więc kiedy usunąłem wersję 4.0_4.112.4.0 z GAC, działała dobrze.

Ścieżka GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

Przed : wprowadź opis obrazu tutaj

Po : wprowadź opis obrazu tutaj

Aby usunąć wersję, można po prostu usunąć odpowiedni folder z GAC.

p4ulinux
źródło
0

Ostatnio musiałem pracować nad starszym projektem, w którym rozwiązanie i wszystkie zawarte w nim projekty były skierowane na platformę x32. Wciąż próbowałem kopiować Oracle.DataAccess.dll i wszystkie inne sugerowane pliki Oracle we wszystkich miejscach, ale za każdym razem uderzałem w ścianę. Wreszcie żarówka w głowicy zaświeciła się (po 8 godzinach :)) i poprosił o sprawdzenie zainstalowanych zespołów ODAC i ich platformy. Miałem już zainstalowanych wszystkich 64-bitowych (x64) klientów ODAC, ale nie 32-bitowych (x32). Zainstalowałem 32-bitowy ODAC i problem zniknął.

Jak sprawdzić wersję zainstalowanego ODAC: Szukaj w folderze C: \ Windows \ assembly. Właściwość „Architektura procesora” informuje platformę o zainstalowanym ODAC.

Osiem godzin to długi czas na zapalenie się żarówki. Nic dziwnego, że zawsze muszę tłuc się w pracy :).

DiligentKarma
źródło
Uwaga, C:\Windows\assembliespokazuje tylko zestawy do .NET Framework w wersji 2.0. Wersja 3.x / 4.x nie jest wyświetlana, patrz stackoverflow.com/questions/28213105/ ...
Wernfried Domscheit,
0

Rozwiązanie Chrisa też się sprawdziło. Otrzymałem jednak następujący komunikat o błędzie, który mówi:

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.

Najwyraźniej w obcym języku Oraclish oznacza to, że twój program jest skierowany albo na wszystkie platformy, albo na komputery 32-bitowe. Po prostu zmień platformę docelową we właściwościach projektu na 64-bitową i miej nadzieję na najlepsze.

Cameron Castillo
źródło
3
To właściwie .NETish, a nie Oraclish
Jay Sullivan
0

Miałem ten sam problem z Oracle.DataAccess.dll v4.121.2.0. z instalacją w 2 domach (wersje 32 i 64 bitowe). Wersja 32-bitowa workerd, wersja 64-bitowa nie.

W moim przypadku (po 2 dniach prób) stwierdziłem, że problemem były uprawnienia w wersji domowej 64-bitowej. Wiele katalogów w tej wersji miało nadpisane wyłącznie uprawnienia, w przypadku których rola „Użytkownicy uwierzytelnieni” nie miała dostępu „Odczyt”, który jest domyślnie ustawiany w katalogu nadrzędnym. Te podkatalogi obejmowały „bin”, „network / admin”, „nls”, „oracore”, „RDBMS” i prawdopodobnie inne. Znalazłem je, odfiltrowując wynik „BRAK DOSTĘPU” w narzędziu „Process Monitor” (Procmon.exe) z sysinternals. Gdy uprawnienia zostały odziedziczone z katalogu nadrzędnego do podkatalogów podrzędnych, wszystko zaczęło działać.

Nie udało mi się nadpisać uprawnień w całym katalogu domowym Oracle, więc zrobiłem dla nich jeden katalog na raz, ale myślę, że jeśli nie martwisz się tak bardzo o bezpieczeństwo, możesz zresetować go w całym odpowiednim katalogu domowym Oracle.

Greg Z.
źródło
-3

Wiele teoretycznych odpowiedzi tutaj, ale tutaj jest działający przykład z kodem, który możesz skopiować i wkleić i natychmiast przetestować:

  1. Zainstalowałem bazę danych Oracle Express OracleXE112, która jest już dostarczana z kilkoma preinstalowanymi tabelami demonstracyjnymi.
  2. Po uruchomieniu instalatora zostaniesz poproszony o podanie hasła . Jako hasło wpisałem „xxx”. (nieużywany w produkcji)
  3. Mój serwer działa na komputerze 192.168.1.158
  4. Na serwerze należy jawnie zezwolić na dostęp dla procesu TNSLSNR.exe w Zaporze systemu Windows . Ten proces nasłuchuje na porcie 1521. Jeśli w poniższym kodzie wystąpi błąd limitu czasu, sprawdź zaporę.
  5. OPCJA A: Dla C # (.NET2 lub .NET4) możesz pobrać ODAC11 , z którego musisz dodać Oracle.DataAccess.dll do swojego projektu. Dodatkowo ta biblioteka DLL zależy od: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Te DLL musi być w tym samym katalogu co plik EXE lub trzeba podać ścieżkę DLL w: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Na maszynach 64-bitowych pisz dodatkowo doHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPCJA B: Jeśli pobrałeś ODAC12 , potrzebujesz Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), Oraons.dll, msvcr100.dll. Ścieżka rejestru toHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPCJA C: Jeśli nie chcesz dużych bibliotek DLL większych niż 100 MB, pobierz plik ODP.NET_Managed12.xxxxxxxx.zip, w Oracle.ManagedDataAccess.dllktórym znajduje się tylko 4 MB i jest czysto zarządzaną biblioteką DLL, która działa w procesach 32-bitowych i 64-bitowych również i nie zależy od żadnej innej biblioteki DLL i nie wymaga żadnych wpisów w rejestrze.
  8. Poniższy kod C # działa u mnie bez żadnej konfiguracji po stronie serwera (tylko domyślna instalacja):
using Oracle.DataAccess.Client;
lub
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Źródło danych = (DESCRIPTION ="
    + "(LISTA_ADRESÓW = (ADRES = (PROTOKÓŁ = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "ID użytkownika = SYSTEM; Hasło = xxx;";

using (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    using (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "wybierz TABLESPACE_NAME z DBA_DATA_FILES";

        przy użyciu (OracleDataReader dr = cmd.ExecuteReader ())
        {
            podczas (dr Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}
Elmue
źródło
Instalacja całego serwera bazy danych Oracle, gdy potrzebny jest tylko działający klient, jest dość przesadą.
Wernfried Domscheit,
Twoja odpowiedź i tak jest kiepska. Nie ma potrzeby kopiowania żadnych bibliotek DLL Oracle do katalogu aplikacji, ponieważ domyślnie podczas instalacji można je znaleźć za pomocą ‰ PATH% (chyba że zmodyfikujesz ją samodzielnie). Wskazówka dotycząca rejestracji dotyczy tylko wersji 4.xi działa tylko w przypadku 32-bitowy klient Oracle. Jednak głównym tematem tego pytania są niezgodności 32-bitowe i 64-bitowe.
Wernfried Domscheit,
Z Twojego komentarza wynika, że ​​nie przeczytałeś mojej odpowiedzi. Jeśli chcę napisać aplikację, która komunikuje się z serwerem Oracle, nie ma potrzeby instalowania czegokolwiek z Oracle. Po prostu używam wyżej wymienionej biblioteki DLL i rozpowszechniam ją z moją aplikacją. Więc nie będzie nic w zmiennej PATH na komputerze użytkownika końcowego. Nawiasem mówiąc, używanie zmiennej PATH (pochodzącej ze starego wieku DOS z 1980 r.) Jest wysoce przestarzałe w nowoczesnym oprogramowaniu. Moja odpowiedź zaleca OPCJĘ C, która nie potrzebuje żadnych ścieżek rejestru i nie zależy od wersji 32 lub 64 bitowej. OPCJE A i B wspomniałem tylko dla kompletności.
Elmue
Myślę, że bez odpowiedniego ustawienia% PATH% twój Windows w ogóle nie będzie działał - nawet w wersji 10. Wspomniałem w mojej odpowiedzi, że nie jest mądrze kopiować ręcznie jakiekolwiek biblioteki Oracle dll z twoją aplikacją. Nie znam kodu źródłowego tych bibliotek dll, ale może być więcej zależności po stronie klienta, których nie widzisz, np. Wyzwalane przez ustawienia języka, zestawy znaków, strefę czasową itp. Kiedy wykonuję śledzenie za Oracle.DataAccess.dllpomocą, program ładuje łącznie 35 Oracle DLL! Lepiej wykonaj normalną instalację klienta Oracle - oczywiście o ile nie używasz zarządzanego sterownika ODP.NET.
Wernfried Domscheit
1
Myślę, że wspomniałem o swoich obawach: (1) Instalacja bazy danych jest bezużyteczna, czyli przesada. (2) Opcje A i B działają tylko pod pewnymi warunkami, na przykład nie czyta żadnych ustawień NLS z rejestru (dla których potrzebujesz pliku oracle.key). Aby zapewnić kompatybilność, musisz wziąć pod uwagę również pomniejsze wersje. Oracle.DataAccess, Version=2.112.2.0nie działa OraOps11w.dllna przykład z wersją 2.112.4.0.
Wernfried Domscheit