Einzelnen Beitrag anzeigen

dannyl2912

Registriert seit: 23. Okt 2013
3 Beiträge
 
Delphi XE7 Enterprise
 
#1

Dienst und problembehaftete SQLConnection

  Alt 1. Jul 2014, 09:19
Datenbank: MySQL • Version: 5.6.11 • Zugriff über: MySQLConnector/DBExpress
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.

Geändert von dannyl2912 ( 1. Jul 2014 um 12:00 Uhr)
  Mit Zitat antworten Zitat