Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   C# Howto: Ora Instant-Client?? (https://www.delphipraxis.net/87267-howto-ora-instant-client.html)

Phoenix 26. Feb 2007 10:34

Datenbank: Oracle • Version: 10g • Zugriff über: ADO.NET via Corelab / Instant Ora

Howto: Ora Instant-Client??
 
Wie mir hier vorgeschlagen wurde habe ich nun mal den Oracle Instant Client heruntergeladen und in mein Anwendungsverzeichnis kopiert.

Also knapp 22,5 MB an dll's und zwei Jar-Files, wobei ich mir ziemlich sicher bin die nicht zu brauchen.

Das, was ich sonst als Connection Description in meiner TNSNames.ora drin hatte, habe ich nun in den ConnectionString gepackt, nur beim Verbinden mit der Datenbank erhalte ich nun folgenden Fehler:
"Can not load Oracle client. Check your PATH environment and registry settings."

An den Einstellungen dort habe ich jedoch nichts geändert, nur die dll's kopiert und that's it.

Was muss ich da sonst noch beachten? Google hat mir zu der Fehlermeldung leider keinen einzigen akkuraten Treffer geliefert. :-(

Elvis 26. Feb 2007 10:58

Re: Howto: Ora Instant-Client??
 
Mit dem ODP sollte es klappen. Keine Ahnung wofür du die .Jars mitschleppst.
Falls du dem CoreLabs Provider sagen kannst wo er die client lib sucht, sollte es auch damit gehen.

Und @Fehlermeldung, wenn du ein Nischenprodukt wie den CR Provider nimmst, solltest du dich nicht darüber wundern, dass du die Fehlermeldung so selten/nicht in Google siehst. ;)

Bernhard Geyer 26. Feb 2007 11:08

Re: Howto: Ora Instant-Client??
 
Umgebungsvariable ORACLE_HOME angelegt?
tnsnames.ora im Unterpface <Installdir>\Network\Admin angelegt und gefüllt?

Elvis 26. Feb 2007 11:14

Re: Howto: Ora Instant-Client??
 
Zitat:

Zitat von Bernhard Geyer
Umgebungsvariable ORACLE_HOME angelegt?

Sollte wenn dann nur als Anwendungs/Prozessvariable angelegt werden. (Siehe hier)
Zitat:

Kannst du auch zur Laufzeit nur für deinen Prozess absetzen.
tnsnames.ora im Unterpface <Installdir>\Network\Admin angelegt und gefüllt?
Sollte nicht nötig sein, da er den Descriptor direct benutzt, ohne ein Alias (aka TNS Name) zu benutzen.

Oracle cients sind mosntröse, aber sehr zerbrechliche Geschöpfe, deshalb der hier vorgeschlagene Weg, der bestehende Installationen komplett unbehelligt lassen sollte und dich vor allem vor eifrigen Admins schützen sollte.

Phoenix 26. Feb 2007 11:47

Re: Howto: Ora Instant-Client??
 
Auf Umgebungsvariablen habe ich auf dem Zielsystem keinen Zugriff, da darf ich nichts dran ändern müssen.

Ich hab jetzt mal auf die ODP umstellen wollen, aber die lassen sich nicht laden:

Zitat:

Zitat von DbProviderFactories.GetFactory("Oracle.DataAccess. Client")
Failed to find or load the registered .Net Framework Data Provider.

Dabei ist der da. Hier mal meine vorhandenen Factories:

Available Provider:
Name: Odbc Data Provider;
Description: .Net Framework Data Provider for Odbc;
InvariantName: System.Data.Odbc;
AssemblyQualifiedName: System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;

Available Provider:
Name: OleDb Data Provider;
Description: .Net Framework Data Provider for OleDb;
InvariantName: System.Data.OleDb;
AssemblyQualifiedName: System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;

Available Provider:
Name: OracleClient Data Provider;
Description: .Net Framework Data Provider for Oracle;
InvariantName: System.Data.OracleClient;
AssemblyQualifiedName: System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;

Available Provider:
Name: SqlClient Data Provider;
Description: .Net Framework Data Provider for SqlServer;
InvariantName: System.Data.SqlClient;
AssemblyQualifiedName: System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;

Available Provider:
Name: SQL Server CE Data Provider;
Description: .NET Framework Data Provider for Microsoft SQL Server 2005 Mobile Edition;
InvariantName: Microsoft.SqlServerCe.Client;
AssemblyQualifiedName: Microsoft.SqlServerCe.Client.SqlCeClientFactory, Microsoft.SqlServerCe.Client, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91;

Available Provider:
Name: OraDirect .NET Data Provider;
Description: CoreLab OraDirect .NET Data Provider;
InvariantName: CoreLab.Oracle;
AssemblyQualifiedName: CoreLab.Oracle.OracleProviderFactory, CoreLab.Oracle, Version=3.50.9.0, Culture=neutral, PublicKeyToken=09af7300eec23701;

Available Provider:
Name: Oracle Data Provider for .NET;
Description: Oracle Data Provider for .NET;
InvariantName: Oracle.DataAccess.Client;
AssemblyQualifiedName: Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342;


Available Provider:
Name: Local OraDirect .NET Data Provider;
Description: CoreLab OraDirect .NET Data Provider;
InvariantName: CoreLab.Oracle.local;
AssemblyQualifiedName: CoreLab.Oracle.OraDirectFactory, CoreLab.Oracle, Version=3.50.9.0, Culture=neutral, PublicKeyToken=09af7300eec23701;

Nicht wundern das CR zweimal drin ist. Einmal kommt der aus der App.config.

Elvis 26. Feb 2007 12:07

Re: Howto: Ora Instant-Client??
 
Zitat:

Zitat von Phoenix
Auf Umgebungsvariablen habe ich auf dem Zielsystem keinen Zugriff, da darf ich nichts dran ändern müssen.

Wenn du dir den Link von mir angekiekt hast, solltest du gesehen haben, dass die Variable nur für die Laufzeit deines Prozesses und das auch nur für deinen Prozess gilt. Dafür braucht man keine besonderen Rechte und es hat keinen Impact auf andere Software. :)
Zitat:

Ich hab jetzt mal auf die ODP umstellen wollen, aber die lassen sich nicht laden:
Schmeiße ihn unter "DeinPrefix.Oracle.DataAccess.Client" in deine App.config und packe ihn ins Zielverzeichnis. So bist du auch hier unabhängig von allen Quirks des Zielsystems. :)

Phoenix 26. Feb 2007 12:14

Re: Howto: Ora Instant-Client??
 
Zitat:

Zitat von Elvis
Schmeiße ihn unter "DeinPrefix.Oracle.DataAccess.Client" in deine App.config und packe ihn ins Zielverzeichnis. So bist du auch hier unabhängig von allen Quirks des Zielsystems. :)

XML-Code:
  <system.data>
    <DbProviderFactories>
      <add
        name="Local Oracle Data Provider for .NET"
        invariant="Local.Oracle.DataAccess.Client"
        description="Oracle Data Provider for .NET"
        type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342"
      />
     </DbProviderFactories>
  </system.data>
Liefert mir als letzten Eintrag aus GetFactoryClasses:
Available Provider:
Name: Local Oracle Data Provider for .NET;
Description: Oracle Data Provider for .NET;
InvariantName: Local.Oracle.DataAccess.Client;
AssemblyQualifiedName: Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342;

Die Oracle.DataAccess.dll und die Oracle.DataAccess.resources.dll liegen im App-Verzeichnis. Jeoch Gleiche Fehlermeldung:

Zitat:

Zitat von DbProviderFactories.GetFactory("Local.Oracle.DataA ccess.Client")
Failed to find or load the registered .Net Framework Data Provider.


Elvis 26. Feb 2007 12:29

Re: Howto: Ora Instant-Client??
 
Zitat:

Zitat von Phoenix
Die Oracle.DataAccess.dll und die Oracle.DataAccess.resources.dll liegen im App-Verzeichnis. Jeoch Gleiche Fehlermeldung:
Zitat:

Zitat von DbProviderFactories.GetFactory("Local.Oracle.DataA ccess.Client")
Failed to find or load the registered .Net Framework Data Provider.


Hmm... Hätte gehen sollen.
Hast du den Assembly name des full type names[1] aus dem Reflector kopiert? Wenn nicht, ist er da anders?
Wenn er anders ist, klappt es damit?
Wenn nicht, kannst du den Typen der Factory "zu Fuss" laden und instantiieren?
Delphi-Quellcode:
var factoryType := System.Type.GetType('Oracle.DataAccess.Client.OracleClientFactory, ' +
                                       'Oracle.DataAccess, ' +
                                       'Version=1.2.3.4, Culture=neutral, '+
                                       'PublicKeyToken=bliblablubb');
var factory := Activator.CreateInstance(factoryType) as DbProviderFactory;
Wenn selbst das nicht geht -> hmpf! :gruebel:



[1]Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342

Phoenix 26. Feb 2007 12:37

Re: Howto: Ora Instant-Client??
 
1.) Das war Copy & Waste aus dem Reflector.

2.) Nein, System.Type.GetType liefert mir bei diesen Angaben ein null zurück.

Seltsamerweise findet bei mir der Reflector auch nicht die Klasse OracleClientFactory, die ja theoretisch schon in dem Namespace sein sollte. Zumindest laut Ora doku.

Elvis 26. Feb 2007 14:06

Re: Howto: Ora Instant-Client??
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Phoenix
1.) Das war Copy & Waste aus dem Reflector.

Nein war es nicht, oder du hast im Zielordner nicht die Version 2.102.2.20 liegen!
Denn die 2.102.2.20 hat die Factory. (siehe Anhang um dir 200 MB witzlosen Download zu ersparen)
Zitat:

2.) Nein, System.Type.GetType liefert mir bei diesen Angaben ein null zurück.

Seltsamerweise findet bei mir der Reflector auch nicht die Klasse OracleClientFactory, die ja theoretisch schon in dem Namespace sein sollte. Zumindest laut Ora doku.
Probiere es nochmal mit der richtigen Version im Anhang. Oracle hat lange gebraucht um sowas lächerlich einfaches wie eine ProviderFactory zu implementieren (MySql übrigens auch)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz