![]() |
Delphi-Version: 10.3 Rio
OracleConnection.Logon crashed in Windows Dienst
Huhu,
ich bin gerade echt am Verzweifeln. Und zwar habe ich einen Dienst geschrieben, welcher einen DataSnap-Rest-Server zur Verfügung stellt. Der Server selbst funktioniert auch einwandfrei (zumindest solange kein SSL aktiviert ist, aber das ist ein anderes Problem was ich mir zu gegebener Zeit anschauen werde), sobald ich allerdings versuche eine Verbindung zur Datenbank aufzubauen bekomme ich nur noch ein 500 Internal Server Error zurück. Durchs setzen von Try-Except-Blöcken habe ich herausgefunden, dass das Problem die TOracleSession.Logon ist. Sobald die Procedure versucht wird aufzurufen rennt er in die Exception. Ich hab den Code auch einfach mal in einen anderen Server geworfen, der in einer Konsolenanwendung läuft, um Debuggen zu können, nur dort läuft er problemlos durch. Ich bin grad echt überfragt was da fehlt. Hat vielleicht jemand von euch eine Ahnung was ich falsch mache und berücksichtigen muss, wenn ich versuche über TNS eine Verbindung zu Oracle über einen Windows-Dienst aufzubauen? Anbei auch noch der Code zum Verbindungsaufbau:
Delphi-Quellcode:
Vielen Dank auf jedem Fall schon einmal im Vorraus. Ich weiß nämlich grad echt nicht mehr weiter.
constructor TSessionManager.Create;
var mLog : TLogDatei; begin FconfigIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); try FConnection := TOracleSession.Create(nil); FConnection.LogonDatabase := FconfigIni.ReadString('Datenbank', 'Database', 'db'); FConnection.LogonUsername := FconfigIni.ReadString('Datenbank', 'Username', 'user'); FConnection.LogonPassword := FconfigIni.ReadString('Datenbank', 'Password', 'pass'); try FConnection.LogOn; except end; finally FconfigIni.Free; end; end; Viele Grüße Maliko |
AW: OracleConnection.Logon crashed in Windows Dienst
Schau Dir bitte zuerst mal die Rechte an, unter denen der Dienst und die Konsolenanwendung laufen.
Fehlt dem Dienst da eventuell irgendwas, was die Konsole hat? Ist eventuell dort ein Hinweis dabei: ![]() Hat er Infos für Dich? ![]() Passen die Umgebungsvariabeln, Registryeinträge, TNSNAMES.ORA, ... auch für den Dienst? Muss der Dienst eventuell unter 'nem anderen Benutzerkonto laufen? Z. B: dem, unter dem die Konsolenanwendung läuft? |
AW: OracleConnection.Logon crashed in Windows Dienst
Und welche Exception genau?
(Klasse, Exception-Text) |
AW: OracleConnection.Logon crashed in Windows Dienst
Initialization error
Could not locate OCI dll OracleHomeKey: OracleHomeDir: X:\ora11client64 EDIT: Ich hab auch mal versucht meinen normalen Benutzer als Startbenutzer einzutragen, gibt aber die selbe Fehlermeldung. X ist ein Netzlaufwerk, da die TNS-Treiber auf unseren Lokalen Rechnern nicht installiert sind. |
AW: OracleConnection.Logon crashed in Windows Dienst
Das Laufwerk x gibt es nicht in deinem (Vermutlich unter Systemkonto laufenden) Dienst.
Du müsstest dafür sorgen das ein Domain-User genutzt wird und auch noch das das LW verbunden wird (oder statt LW-Buchstaben der Share genutzt wird). Aber für eine Anwendungsfall als Dienst würde ich deine Lokale "Installation" des Treibers empfehlen. Mit dem Instant-Client gibt es auch dort was, was nicht auch den Rechner halt zerstört (XCopy-Installation + Setzen der Umgebungsvariable per Hand). |
AW: OracleConnection.Logon crashed in Windows Dienst
Kennt der Dienst das Laufwerk X: ?
Mach' Dir mal 'ne Stringliste vor die Anmeldung und lade in die die TNSNames.ora. Klappt das oder gibt es dabei 'nen Fehler? Dann kennt der Dienst irgendwas im Dateisystem nicht. Und der Fehler "Could not locate OCI dll" deutet sehr stark darauf hin. Mir scheint da die tatsächliche Umgebung des Dienstes deutlich von der erwarteten abzuweichen. Lies Dir im Dienst mal mit GetEnvironmentStrings die Umgebungsvariabeln ein und schreib' das Ergebnis in 'ne Datei. Den Inhalt der Datei vergleichst Du mit den Umgebungsvariabeln der funktionierenden Konsolenanwendung. Gibt es Unterschiede, fehlen eventuell die für Oracle nötigen Variabeln? Ist die OCI.dll über die Umgebungsvariabel Path des Dienstes zu finden? |
AW: OracleConnection.Logon crashed in Windows Dienst
Ich hab den Ordner jetzt einfach mal von X: auf C: kopiert und jetzt geht es. Es scheint also tatsächlich der Fall zu sein, dass der Dienst nicht auf X: zugreifen kann. Ich muss am Montag mal mit unseren Sysadmins sprechen, wie wir das Lösen wollen. Zumindest kann ich jetzt erst mal weiterarbeiten.
EDIT: Ich hatte versucht den Dienst über meinen normalen Windows-Benutzer zu starten aber das hatte auch keinen Unterschied gemacht. |
AW: OracleConnection.Logon crashed in Windows Dienst
Die Laufwerkszuweisung erfolgt erst bei der Anmeldung als User. Bei 'nem Dienst wird die nicht durchlaufen, so dass derartige Einstellungen im Dienst nicht zur Verfügung stehen.
Weißt Du wohin x: zeigt? Wenn ja kannst Du statt X: auch die entsprechende Share nutzen, als z. B. statt x:\ora11client64 \\servername\ora11client64 Wenn der Dienst über \\servername\ora11client64 auf das Laufwerk zugreifen kann, könnte es eventuell funktonieren, wenn Du die Umgebungsvariabel Path am Anfang des Dienstes selbst erweiterst.
Delphi-Quellcode:
SetEnvironmentVariable('PATH', PChar(Format('%s;%s',['\\servername\ora11client64',GetEnvironmentVariable('PATH')])));
Zugegeben: Unschön, aber falls Ihr keine bessere Lösung findet, ist's zumindest einen Versuch wert. Ggfls. könntest Du aber auch innerhalb des Dienstes die Laufwerksverbindung selbst herstellen: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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-2025 by Thomas Breitkreuz