Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO - Der Provider kann nicht gefunden werden (https://www.delphipraxis.net/125401-ado-der-provider-kann-nicht-gefunden-werden.html)

andreash 5. Dez 2008 13:04

Datenbank: Oracle • Zugriff über: ADO

ADO - Der Provider kann nicht gefunden werden
 
Hallo,

ich habe folgendes Problem:

Ich möchte über eine ADOConnection auf eine Oracle-DB zugreifen und setze Provider='OraOLEDB.Oracle.1'.
Wenn ich nun Versuche, die Eigenschaft ADOConnection.Properties.Item['User ID'] zu setzten wird folgende Exception geworfen:
"EOleException: Der Provider kann nicht gefunden werden. Möglicherweise ist er nicht richtig installiert worden".

Der Zugriff erfolgt in einem Programm mit mehreren Threads. Wenn ich Provider auf 'MSDASQL.1' setze funktionieren alle Lesezugriffe nur beim Schreiben gibt es Probleme.

Der Provider ist installiert, da die dieser mit anderen Programmen funktioniert. Auch das Enumierieren aller verfügbaren Provider, zeigt, dass der Provider vorhanden ist.

Tippfehler sind auch ausgeschlossen.

Welche Voraussetzungen müssen erfüllt sein, damit der Provider gefunden wird?

Ich bin für jeden Hinweis dankbar!
Andreas

[Edit] "Typfehler" korrigiert. [/edit]

sirius 5. Dez 2008 13:11

Re: ADO - Der Provider kann nicht gefunden werden
 
Was ist denn wenn du den ConnectionString von ADO mit dem Dialog zusammensetzt? Gibt es dort den Provider?

Bernhard Geyer 5. Dez 2008 13:14

Re: ADO - Der Provider kann nicht gefunden werden
 
Ist der Provider OraOLEDB überhaupt Threadsave bzw. darf er in anderen Threads als den Hauptthread überhaupt verwendet werden.
Auch ist Oracle immer allergisch wenn irgendwelche Umgebungsvariablen (z.B. ORACLE_HOME) nicht gefunden werden. Sind diese im Thread verfügbar?

shmia 5. Dez 2008 13:15

Re: ADO - Der Provider kann nicht gefunden werden
 
Zitat:

Zitat von andreash
Ich möchte über eine ADOConnection auf eine Oracle-DB zugreifen und setze Provider='OraOLEDB.Oracle.1'.

Warum verwendest du keine UDL-Datei ??
http://www.efg2.com/Lab/Library/Delp...UDL/index.html
UDL-Dateien enthalten alle Eigenschaften einer ADO-Connection und kann zur Laufzeit eines Programms dynamisch geladen werden.
Ein grosser Vorteil ist, dass man ausserhalb des Programms ein Verbindungstest zur Datenbank ausführen kann.

PS:
achja, die berüchtigten Tippfehler.
Du schreibst ja: Typfehler sind auch ausgeschlossen.
und meinst damit wohl Tippfehler.
Das bedeutet aber, dass man Tippfehler niemals ausschliesen sollte!
Auch hier hat eine UDL-Datei den Vorteil, dass diese Fehlerquelle nicht zum Zuge kommen kann.

andreash 5. Dez 2008 13:54

Re: ADO - Der Provider kann nicht gefunden werden
 
Danke für die schnellen vielen Antworten.

Zitat:

Was ist denn wenn du den ConnectionString von ADO mit dem Dialog zusammensetzt? Gibt es dort den Provider?
Den Provider gibt es dort. Beim Zusammenstellen des Connectionstrings über den UDL-Wizard wird genau dieser eingetragen und die Verbindung ist beim Test über dessen Dialog erfolgreich.

@shmia: Aus Designgründen verwende ich keine UDL-Datei in diesem Projekt. Mit meinem "Typfehler" hast du mich natürlich ertappt. :-)
Den Providernamen habe ich aus einer UDL-Datei kopiert. Zum Testen habe ich den Text, den ich in die Eigenschaft Provider eintrage, mit den Namen der in der Registrierung eingetragenen Provider verglichen und es gab einen Treffer.

@Bernhard Geyer: Das ist ein guter Einwand, weil die DB-Zugriffe nicht im Hauptthread laufen. Ich werde recherchieren.

sirius 5. Dez 2008 14:45

Re: ADO - Der Provider kann nicht gefunden werden
 
Wenn du nicht im Hauptthread bist brauchst du mindestens coinitialize. Und am besten die ganze Datenbankarbeit in einen Thread legen.

andreash 5. Dez 2008 15:31

Re: ADO - Der Provider kann nicht gefunden werden
 
Die DB-Funktionen sind in einer Dll gekapselt, die keine Threads verwendet. CoInitialize wird beim Linken aufgerufen.

In der Zwischenzeit habe ich das Programm so geändert, dass die Aufrufe über den Hauptthread erfolgen. Aber der Fehler besteht immer noch. Über einen Vergleich von MainThreadID und GetCurrentThreadID überprüfe ich, ob ich dabei keinen Fehler mache.

Übrigens wird die DLL in einem Dienst verwendet. Vielleicht ist das eine Ursache. Ich bin für jeden weiteren Rat dankbar.

andreash 8. Dez 2008 12:33

Re: ADO - Der Provider kann nicht gefunden werden
 
Nachdem es auf einem anderen Rechner funktioniert, konnte ich Ursachenforschung betreiben: Ich habe wohl die Oracle-Client Version verwendet (9 statt 10, beide sind installiert). Der Gedanke von "Bernhard Geyer" war somit richtig. Unter HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE habe ich den Wert für ORACLE_HOME auf das richtige Verzeichnis gesetzt. Nun funktioniert die DB-Verbindung.
Warum es aber unter Umständen vorher trotzdem funktionierte und nur der Dienst Ärger machte, weiß ich nicht.

Bernhard Geyer 8. Dez 2008 12:43

Re: ADO - Der Provider kann nicht gefunden werden
 
Zitat:

Zitat von andreash
... Der Gedanke von "Bernhard Geyer" war somit richtig. Unter HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE habe ich den Wert für ORACLE_HOME auf das richtige Verzeichnis gesetzt. Nun funktioniert die DB-Verbindung.
Warum es aber unter Umständen vorher trotzdem funktionierte und nur der Dienst Ärger machte, weiß ich nicht.

Es gibt neben Registry-Key auch Umgebungsvariablen. Welche gezogen weiß vermutlich nur das Oracle :-)

andreash 8. Dez 2008 13:43

Re: ADO - Der Provider kann nicht gefunden werden
 
Zuerst habe ich es auch mit einer Umgebungsvariable ORACLE_HOME versucht. Das hat nicht funktioniert. Vielleicht wird der Registryeintrag bevorzugt. Für weitere Tests fehlt mir im Moment die Zeit.

Vielen Dank für die Lösungsideen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.

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