[C#] Der Provider ist nicht mit der Version von Oracle Client kompatibel



Answers

Sie sollten alle x86 / x64-Gespräche hier für Anfänger ignorieren und stattdessen den ODP.NET Managed Driver ausprobieren (wenn Sie .Net v4 + verwenden):

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

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

Oracle ODP.net Managed vs Unmanaged Treiber

Vermeiden Sie alle "unmanaged" welche DLL welche Architektur ausgibt! : D (ungefähr Zeit Oracle).

Das NuGet-Paket (funktioniert auch für 11g):

Die alte / manuelle Methode:

Informationen zum Konvertieren in die Verwendung der verwalteten Bibliotheken:

  • Erstens, hier ist ein großartiger Code-Vergleich von verwalteten vs nicht verwalteten : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Stellen Sie sicher, dass Sie nur die ODP.NET, Managed Driver Xcopy-Version heruntergeladen haben
  • Kopieren und fügen Sie aus der heruntergeladenen Zip-Datei in Ihr Projektverzeichnis ein:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Fügen Sie einen Verweis auf Oracle.ManagedDataAccess.dll hinzu
  • Stellen Sie sicher, dass Ihre Exe mit beiden DLLs freigegeben ist (in VS2010 zum Anwendungsordner hinzugefügt)
Question

Ich versuche den Oracle ODP.NET 11g (11.1.0.6.20) Instant Client in meinem ASP.net Projekt als Datenprovider zu verwenden, aber wenn ich die aspx Seite ausführe, bekomme ich einen " Der Provider ist nicht kompatibel mit der Version von Oracle-Client "Fehlermeldung. Jede Hilfe wäre willkommen.

Ich habe den Datenanbieter in Visual Studio 2005 referenziert und der Code dahinter sieht so aus:

using Oracle.DataAccess.Client;
..

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

//Do Something

oOracleConn.Close();

Der Fehler für die Seite sieht folgendermaßen aus:

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



Suchen Sie auch nach IIS-Anwendungspool Aktivieren Sie das 32-Bit-Wahr- oder -Falsch-Flag. Wenn Sie diese Nachricht sehen, hat mich ein Orakel-Forum dazu aufgefordert!




Für Oracle 11g (11.1.0.7.20) musste ich die folgenden dlls zusammen mit meiner Exe hinzufügen, um zu arbeiten.

  1. oci.dll
  2. OraOps11.dll
  3. oraociicus11.dll (ziemlich groß in der Nähe von 30 MB)
  4. Oracle.DataAccess.dll



Vor kurzem musste ich an einem älteren Projekt arbeiten, bei dem die Lösung und alle enthaltenen Projekte auf die x32-Plattform ausgerichtet waren. Ich habe versucht, Oracle.DataAccess.dll und alle anderen vorgeschlagenen Oracle-Dateien an allen Orten zu kopieren, aber jedes Mal die Wand zu schlagen. Schließlich leuchtete die Glühbirne im Kopf auf (nach 8 Stunden :)) und fragte nach den installierten ODAC-Baugruppen und deren Plattform. Ich hatte alle 64-Bit (x64) ODAC-Clients bereits installiert, aber nicht die 32-Bit-ODAC-Clients (x32). Installierte den 32-Bit ODAC und das Problem verschwand.

So prüfen Sie die Version des installierten ODAC: Suchen Sie im Ordner C: \ Windows \ assembly. Die Eigenschaft "Prozessorarchitektur" informiert die Plattform über installierte ODAC.

Acht Stunden sind eine lange Zeit, bis die Glühbirne aufleuchtet. Kein Wunder, ich muss immer bei der Arbeit hauen :).




Nachdem ich drei Stunden damit verschwendet hatte, war mein Problem einfach:

Fehlende OraOps11w.dll

Warum sollte das die Fehlermeldung "Der Anbieter ist nicht kompatibel mit der Oracle Client-Version" sein? Es muss schlechtes Codieren / Testen von Oracle sein. Ich benutze Oracle seit 1994 und viele Male seit 2002 mit .Net. Es ist praktisch immer ein Schmerz.

Jeder sollte Oracle deinstallieren und Chris Lösung oben folgen (oberste Antwort) . Das sollte jedes Mal funktionieren

Von einem anderen Beitrag in ist das wie man Oracle deinstalliert (vergiss das Oracle Deinstallationswerkzeug, da es nicht richtig funktioniert):

  • Deinstallieren Sie alle Oracle-Komponenten mit dem Oracle Universal Installer (OUI).
  • Führen Sie regedit.exe aus und löschen Sie den Schlüssel HKEY_LOCAL_MACHINE / SOFTWARE / ORACLE. Dies enthält Registrierungseinträge für alle Oracle-Produkte.
  • Löschen Sie alle Verweise auf Oracle-Dienste, die im folgenden Teil der Registrierung zurückgelassen werden: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / Ora * Es sollte ziemlich offensichtlich sein, welche sich auf Oracle beziehen.
  • Starten Sie Ihren Computer neu.
  • Löschen Sie das Verzeichnis "C: \ Oracle" oder welches Verzeichnis auch immer Ihr ORACLE_BASE ist.
  • Löschen Sie das Verzeichnis "C: \ Programme \ Oracle".
  • Leeren Sie den Inhalt Ihres Verzeichnisses "c: \ temp".
  • Leeren Sie Ihren Papierkorb.

Chris hat weniger DLLs als ich auf Server 2003 (32 Bit). Das habe ich:

C:\oracle\instantclient>dir /b  
oci.dll  
ociw32.dll  
Oracle.DataAccess.dll  
orannzsbb11.dll  
oraocci11.dll  
oraociei11.dll  
OraOps11w.dll  
Orasqlplusic11.dll  
sqlplus.exe  
tnsnames.ora  

C: \ oracle \ instantclient befindet sich in der Umgebungsvariable "global path" und "ORACLE_HOME". .Net-Code verweist auf C: \ oracle \ instantclient \ Oracle.DataAccess.dll




Ich hatte das gleiche Problem mit Oracle.DataAccess.dll v4.121.2.0. mit 2-Häuser-Installation (32- und 64-Bit-Versionen). 32-Bit-Version workerd, 64-Bit-Version nicht.

In meinem Fall (nach 2 Testtagen) stellte ich fest, dass das Problem die Berechtigungen für die 64-Bit-Home-Version waren. Viele Verzeichnisse in dieser Version hatten ausschließlich Berechtigungen überschrieben, bei denen die Rolle "Authentifizierte Benutzer" nicht über den Lesezugriff verfügte, der standardmäßig im übergeordneten Verzeichnis festgelegt ist. Diese Unterverzeichnisse enthalten "bin", "network / admin", "nls", "oracore", "RDBMS" und möglicherweise andere. Ich habe sie gefunden, indem ich "ACCESS DENIED" im "Process Monitor" (Procmon.exe) Dienstprogramm von sysinternals herausgefiltert habe. Sobald die Berechtigungen vom übergeordneten Verzeichnis in diese untergeordneten Unterverzeichnisse übernommen wurden, begann alles zu funktionieren.

Ich habe nicht die Berechtigungen für das gesamte Orakelhaus außer Kraft gesetzt, also habe ich sie ein Verzeichnis nach dem anderen gemacht, aber ich denke, wenn Sie sich nicht so sehr um Sicherheit sorgen, können Sie es auf das gesamte entsprechende Orakel-Home-Verzeichnis zurücksetzen.




Dies kann durch Ausführen einer 64-Bit-.NET-Laufzeitumgebung für einen 32-Bit-Oracle-Client verursacht werden. Dies kann passieren, wenn Sie auf Ihrem Server die App 64 Bit darauf ausführen. Es wird die .NET-Anwendung mit der 64-Bit-Laufzeit ausführen. Sie können das CPU-Flag in Ihrem Projekt in VS für die Ausführung in der 32-Bit-Laufzeit festlegen.




Hat der IIS / IWAM-Benutzer Berechtigungen für das Oracle-Verzeichnis? Können Sie mit einer anderen App, z. B. Excel oder Access, eine Verbindung zu dieser Datenquelle herstellen?




Für alle, die immer noch dieses Problem haben: basierend auf diesem Artikel

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

Ich habe herausgefunden, dass auf meinem Server die Microsoft C ++ Visual Runtime-Bibliothek fehlte - ich hatte sie auf meinem Dev-Computer, weil Visual Studio installiert war. Ich habe die (aktuellste) aktuellste Version der Bibliothek von hier heruntergeladen und installiert:

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

Ran das Setup und der Oracle Call von C # hat es geschafft!




Ich bin nicht auf die Straße gegangen, um neue DLLs zu bekommen. Wir hatten eine Menge existierender Projekte, die perfekt funktionierten und es war nur mein neues Projekt, das mir Kopfschmerzen bereitete, also entschied ich mich, etwas anderes zu versuchen.

Mein Projekt verwendete eine intern entwickelte Internal.dll, die von Oracle.DataAccess.dll v4.112.3.0 abhing. Aus irgendeinem Grund hat Visual Studio beim Veröffentlichen immer v4.121.0.0 hochgeladen, obwohl es in keiner der Konfigurationsdateien explizit angegeben wurde. Deshalb habe ich einen Fehler bekommen.

Also was ich getan habe, war:

  1. Kopiere Internal.dll von einem der erfolgreich laufenden Projekte auf meine Website /bin (nur um auf der sicheren Seite zu sein).
  2. Kopierte Oracle.DataAccess.dll von einem der erfolgreich ausgeführten Projekte auf die /bin Datei meiner Website.
  3. Fügen Sie auf meiner Website eine Referenz zu beiden hinzu.
  4. Schließlich wurde die Oracle.DataAccess-Referenz in myWebSite.csproj , aber es wurde die falsche Version v4.121.0.0 : v4.121.0.0 statt v4.112.3.0 .
  5. Ich habe den Verweis in myWebSite.csproj manuell geändert, so dass es jetzt gelesen wird:

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



Ich habe das gleiche Problem, aber in meinem Fall kann ich nicht einfach die DLLs in den Ordner bin kopieren, dann "Rebind" nur die Assembly-Version.

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



Viele theoretische Antworten hier, aber hier kommt ein funktionierendes Beispiel mit Code, den Sie kopieren und einfügen und sofort testen können:

  1. Ich habe die Oracle Express-Datenbank OracleXE112 installiert, die bereits einige vorinstallierte Demotabellen enthält .
  2. Wenn Sie das Installationsprogramm starten, werden Sie nach einem Passwort gefragt. Ich habe "xxx" als Passwort eingegeben. (nicht in der Produktion verwendet)
  3. Mein Server läuft auf dem Rechner 192.168.1.158
  4. Auf dem Server müssen Sie ausdrücklich den Zugriff auf den Prozess TNSLSNR.exe in der Windows- Firewall erlauben. Dieser Prozess überwacht Port 1521. Wenn Sie einen Zeitüberschreitungsfehler von dem folgenden Code erhalten, überprüfen Sie Ihre Firewall.
  5. OPTION A: Für C # (.NET2 oder .NET4) können Sie ODAC11 herunterladen, von dem Sie Oracle.DataAccess.dll zu Ihrem Projekt hinzufügen müssen. Außerdem hängt diese DLL ab von: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Diese DLLs müssen sich im selben Verzeichnis wie die EXE befinden oder Sie müssen den DLL-Pfad in folgendem Pfad angeben: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath . On 64 bit machines write additionally to HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPTION B: If you have downloaded ODAC12 you need Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll. The Registry path is HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPTION C: If you don't want huge DLL's of more than 100 MB you should download ODP.NET_Managed12.xxxxxxxx.zip in which you find Oracle.ManagedDataAccess.dll which is only 4 MB and is a pure managed DLL which works in 32 bit and 64 bit processes as well and depends on no other DLL and does not require any registry entries.
  8. The following C# code works for me without any configuration on the server side (just the default installation):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Data Source=(DESCRIPTION="
    + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
    + "(CONNECT_DATA=(SERVER=DEDICATED)));"
    + "User Id=SYSTEM;Password=xxx;";

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

        using (OracleDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                listBox.Items.Add(dr["TABLESPACE_NAME"]);
            }
        }
    }
}



Es scheint mir, dass, obwohl Sie ODP mit dem Oracle-Istant-Client haben, das ODP versuchen könnte, stattdessen den tatsächlichen Oracle-Client zu verwenden. Haben Sie einen Standard-Oracle-Client auf dem Computer installiert? Ich erinnere mich, dass Oracle ziemlich wählerisch war, wenn es um mehrere Clients auf demselben Rechner ging.




Links