Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OracleConnection.Logon crashed in Windows Dienst (https://www.delphipraxis.net/205659-oracleconnection-logon-crashed-windows-dienst.html)

Maliko 2. Okt 2020 11:32

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:
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;
Vielen Dank auf jedem Fall schon einmal im Vorraus. Ich weiß nämlich grad echt nicht mehr weiter.

Viele Grüße
Maliko

Delphi.Narium 2. Okt 2020 12:06

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: https://www.delphipraxis.net/156733-...us-delphi.html

Hat er Infos für Dich? http://www.dba-oracle.com/t_windows_...e_location.htm

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?

Bernhard Geyer 2. Okt 2020 12:07

AW: OracleConnection.Logon crashed in Windows Dienst
 
Und welche Exception genau?
(Klasse, Exception-Text)

Maliko 2. Okt 2020 12:08

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.

Bernhard Geyer 2. Okt 2020 12:29

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

Delphi.Narium 2. Okt 2020 12:33

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?

Maliko 2. Okt 2020 12:37

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.

Delphi.Narium 2. Okt 2020 12:51

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: https://www.delphipraxis.net/129771-...verbinden.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 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