Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Dienst und problembehaftete SQLConnection (https://www.delphipraxis.net/180920-dienst-und-problembehaftete-sqlconnection.html)

dannyl2912 1. Jul 2014 08:19

Datenbank: MySQL • Version: 5.6.11 • Zugriff über: MySQLConnector/DBExpress

Dienst und problembehaftete SQLConnection
 
Hallo,

ich habe ein Problem, was ich nicht so recht identifiziert bekomme. Bevor ich gleich mit Quelltext-Schnipseln komme eine kurze Erläuterung. Ich möchte einen Dienst erstellen, der einen Zugriff auf die vorhandene MySQL-Datenbank hat, um zukünfigt mit eingehenden Daten automatisiert abarbeiten kann.

Hier die Funktion zum Aufbau der Verbindung. Die übergebene Variable für _SQLConnection ist deklariert und sie funktioniert so in meinem Hauptprogramm, da dies eine geteilt genutzte Unit ist.

Code:
function SQLConnect(_Object: TComponent; dbID: string; var _SQLConnection: TSQLConnection): boolean;
begin
  _SQLConnection := TSQLConnection.Create(_Object);
  with _SQLConnection do
  begin
    Name := 'SQLConnection' + dbID;
    ConnectionName := 'MySQLConnection';
    // hier evtl. andere Datenbanken prüfen oder über Ini-Datei gehen
    DriverName := 'MySQL';
    GetDriverFunc := 'getSQLDriverMYSQL';
    LibraryName := 'dbexpmysql.dll';
    LoadParamsOnConnect := False;
    LoginPrompt := False;
    KeepConnection := true;
    params.Values['DriverName'] := 'MySQL';
    params.Values['HostName'] := 'localhost';
    params.Values['Database'] := 'db_name';
    params.Values['User_Name'] := 'user';
    params.Values['Password'] := 'pw';
    params.Values['BlobSize'] := '-1';
    params.Values['LocaleCode'] := '0000';
    params.Values['Compress'] := 'True';
    params.Values['Reconnect'] := 'True';
    params.Values['LoginTimeout'] := '60';
    params.Values['ReadTimeout'] := '15';
    params.Values['WriteTimeout'] := '15';
    VendorLib := 'libmysql.dll';
    try
      Connected := true;
    except
     on e:Exception do Protokoll(DateTimeToStr(now)+' ' + e.Message,'service.log');
    end;
  end;
  Result := _SQLConnection.Connected;
end;
In dem Dienst wird dies wie folgend aufgerufen:

Code:
procedure TOnlineThread.Execute;
begin

  Protokoll(DateTimeToStr(now)+' Dienst wird gestartet -1 !','service.log');

  if SQLConnect(PZOnline, '1', PSPSQLConnection) = false then // Datenbank-Verbindung aufbauen!
  begin
    Protokoll('Verbindung zum Datenbank-Server nicht möglich!' + #13 + #10 + 'Programm wird beendet!','service.log');
    Terminate;
  end;

  Protokoll(DateTimeToStr(now)+' Dienst wird gestartet -1a !','service.log');


//... weiterer Quellcode

  while not Terminated do
  begin
     Protokoll(DateTimeToStr(now)+' Dienst läuft!','service.log');
     Sleep(500);
  end;

end;
Wenn ich den Teil mit dem SQLConnect auskommentiere kommt mein Dienst in die Schleife und schreibt 'Dienst läuft' in mein Protokoll. Führe ich das notwendige SQLConnect aus, steht der Protokolleintrag mit dem ' Dienst wird gestartet -1 !' als letzter Eintrag. Ich konnte die hängen bleibende Stelle ermitteln. Es ist das Connected=true, selbst ein Open bereitet mir hier ein gleiches Problem. Denn den nachfolgenden Eintrag ' Dienst wird gestartet -1a !' bekomme ich nicht und der Fehlerfall mit einer fehlenden Verbindung bekomme ich ebenso wenig. Im Task-Manager bzw. Dienst-Manager kann ich den Dienst als "laufend" identifizieren. Eine Status-Abfrage am MySQL-Server sagt, dass keine weitere Verbindung aufgebaut wurde.


Danke schon mal

Edit: Funktion mit Try-Code erweitert mit gleichem Ergebnis.

dannyl2912 1. Jul 2014 12:25

AW: Dienst und problembehaftete SQLConnection
 
Edit:


nach ein paar Änderungen bekomme ich folgende Meldung:

Code:
01.07.2014 14:36:39 Dienst wird gestartet -1 !
01.07.2014 14:36:44 Unbekannter Treiber: MySQL
Verbindung zum Datenbank-Server nicht möglich!
Programm wird beendet!
Ich habe die dbexpmysql.dll in den aktuellen Namen dbxmys.dll umbenannt. Ich habe die DLLs nun mit Pfad angegeben, habe die DLLs lokal und in Windows\SYSWOW64 kopiert. Das Hauptprogramm läuft immer, der Dienst mit der gleichen Funktion unter keiner der Bedinungen. Dazu reagiert das Hauptprogramm allergisch, wenn ich eine andere Version der libmysql.dll unterschiebe. Dies wird vom Dienst ignoriert.


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