Einzelnen Beitrag anzeigen

af99

Registriert seit: 22. Apr 2004
84 Beiträge
 
Delphi XE5 Ultimate
 
#1

Zugriff auf MYSQL per DBExpress

  Alt 30. Nov 2015, 08:32
Delphi-Version: 5
Hallo Zusammen,

Zugriff auf die MYSQL per DBExpress
Delphi XE5
libmysql.dll liegt im exe Ordner

Ich habe das Programm 2 mal Implementiert. Einmal als VCL-Formularanwendung und einmal als Konsolenprogramm. Die Programme an sich sind identisch (bis auf die Formularanwendung spezifischen Sachen).

In der Formularanwendung habe ich die Komponenten TSQLConnection, TSQLQuery auf dem Formular.

In der Konsolenanwendung erzeuge ich diese.
Hier der Sourcecode der Formularanwendung
Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Buttons, Data.DBXMySQL, Data.SqlExpr,
  Data.FMTBcd, Vcl.Grids, Vcl.DBGrids;

type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    DataSource1: TDataSource;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    CB_imc: TCheckBox;
    CB_sjs: TCheckBox;
    Label5: TLabel;
    Edit4: TEdit;
    SQLConnection1: TSQLConnection;
    SQLQuery1: TSQLQuery;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.BitBtn1Click(Sender: TObject);
var
  imc : string;
begin
  Memo1.Lines.Clear;



  SQLQuery1.Active := False;
  SQLQuery1.sql.Clear;

  if CB_imc.Checked then
    imc := 'inner join nagios.nagios_servicestatus ss on ss.service_object_id = s.service_object_id and ss.current_state=2 '
  else
    imc := '';

  if CB_sjs.Checked then
  begin
    // summe critical wahlweise über imc nur die die auch im moment critical sind
    SQLQuery1.SQL.Add('SELECT ' +
                      's.display_name, ' +
                      'sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) as ausfallzeit ' +
                      'FROM nagios.nagios_hosts h ' +
                      'inner join nagios.nagios_services s on s.host_object_id = h.host_object_id ' +
                      'inner join nagios.nagios_servicechecks sc on sc.service_object_id = s.service_object_id ' +
                      imc +
                      'where ' +
                      's.display_name like ' + quotedstr(edit1.text) + ' and ' +
                      'sc.state = 2 and ' +
                      'TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < ' + edit3.text + ' ' +
                      'group by s.display_name ' +
                      'having sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) > ' + edit2.text
                     );
  end else
  begin
    // einzeln critical wahlweise über imc nur die die auch im moment critical sind
    SQLQuery1.SQL.Add('SELECT ' +
                      's.display_name, ' +
                      'TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time)) ' +
                      'FROM nagios.nagios_hosts h ' +
                      'inner join nagios.nagios_services s on s.host_object_id = h.host_object_id ' +
                      'inner join nagios.nagios_servicechecks sc on sc.service_object_id = s.service_object_id ' +
                      imc +
                      'where ' +
                      's.display_name like ' + quotedstr(edit1.text) + ' and ' +
                      'sc.state = 2 and ' +
                      'TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < ' + edit3.text + ' and ' +
                      'TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time)) > ' + edit2.text
                     );
  end;

  SQLQuery1.Active := true;

  repeat
     Memo1.Lines.Add(SQLQuery1.FieldByName('display_name').AsString ); //+ ' Ausfallzeit: ' + floattostr(strtoint(SQLQuery1.FieldByName('ausfallzeit').AsString) / 60) + ' Minuten');
    SQLQuery1.Next;
  until SQLQuery1.Eof;
end;

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  SQLQuery1.Active := false;
  SQLConnection1.Connected := false;
end;

end.
hier der der Konsolenanwendung
Delphi-Quellcode:
program check_multi_af;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Data.DBXMySQL,
  Data.SqlExpr,
  Data.FMTBcd;

var
  SQLConnection1: TSQLConnection;
  SQLQuery1: TSQLQuery;
  returncode : integer;
  returntext, like_service, sum_o_einzeln, imc, sum_dif_s_e, start_crit, jetzt_critical : string;

begin

  returncode := 3;
  returntext := 'UNKNOWN - unbekannter Fehler !';

  if ParamCount = 5 then
  begin
    sum_dif_s_e := ParamStr(1);
    start_crit := ParamStr(2);
    like_service := ParamStr(3);
    jetzt_critical := ParamStr(4);
    sum_o_einzeln := ParamStr(5);

    //CoInitialize(nil);
    SQLConnection1 := TSQLConnection.Create(nil);
    SQLQuery1 := TSQLQuery.Create(nil);

    try
      SQLConnection1.LoginPrompt := False;
      SQLConnection1.DriverName := 'MySQL';
      SQLConnection1.GetDriverFunc := 'getSQLDriverMYSQL50';
      SQLConnection1.LibraryName := 'dbxopenmysql50.dll';
      SQLConnection1.VendorLib := 'libmysql.dll';
      SQLConnection1.Params.Values['HostName'] := 'xxx';
      SQLConnection1.Params.Values['Database'] := 'xxx';
      SQLConnection1.Params.Values['User_Name'] := 'xxx';
      SQLConnection1.Params.Values['Password'] := 'xxx';

      SQLConnection1.Open;
      SQLConnection1.Connected := true;
      SQLQuery1.SQLConnection := SQLConnection1;

      if jetzt_critical = '1then
        imc := 'inner join nagios.nagios_servicestatus ss on ss.service_object_id = s.service_object_id and ss.current_state=2 '
      else
        imc := '';

      if uppercase(sum_o_einzeln) = 'Sthen
      begin
        // summe critical wahlweise über imc nur die die auch im moment critical sind
        SQLQuery1.SQL.Add('SELECT ' +
                          's.display_name, ' +
                          'sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) as ausfallzeit ' +
                          'FROM nagios_hosts h ' +
                          'inner join nagios_services s on s.host_object_id = h.host_object_id ' +
                          'inner join nagios_servicechecks sc on sc.service_object_id = s.service_object_id ' +
                          imc +
                          'where ' +
                          's.display_name like ' + quotedstr(like_service) + ' and ' +
                          'sc.state = 2 and ' +
                          'TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < ' + start_crit + ' ' +
                          'group by s.display_name ' +
                          'having sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) > ' + sum_dif_s_e
                         );
      end else
      begin
        // einzeln critical wahlweise über imc nur die die auch im moment critical sind
        SQLQuery1.SQL.Add('SELECT ' +
                          's.display_name, ' +
                          'TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time)) ' +
                          'FROM nagios_hosts h ' +
                          'inner join nagios_services s on s.host_object_id = h.host_object_id ' +
                          'inner join nagios_servicechecks sc on sc.service_object_id = s.service_object_id ' +
                          imc +
                          'where ' +
                          's.display_name like ' + quotedstr(like_service) + ' and ' +
                          'sc.state = 2 and ' +
                          'TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < ' + start_crit + ' and ' +
                          'TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time)) > ' + sum_dif_s_e
                         );
      end;

      SQLQuery1.Active := true;

      if SQLQuery1.RecordCount > 0 then
      begin
        repeat
          returntext := returntext + SQLQuery1.FieldByName('display_name').AsString + ', ';
          SQLQuery1.Next;
        until SQLQuery1.Eof;

        if copy(returntext, length(returntext) - 2, 1) = ',then
          returntext := copy(returntext, 1, length(returntext) - 1);

        returncode := 2;
        returntext := 'CRITICAL - Services laufen nicht in den angegebenen Zeitraeumen ' + returntext;
      end else
      begin
        returncode := 0;
        returntext := 'OK - alle Services laufen in den angegebenen Zeitraeumen';
      end;
    finally
      //CoUninitialize;
      writeln(returntext);
      SQLQuery1.Active := false;
      SQLConnection1.Close;
    end;
  end else
  begin
    writeln('Benutzung: check_multi_af like_service start_crit sum_dif_s_e jetzt_crit sum_o_einz' +
            CHR(10) + CHR(13) +
            'like_service: ist die Einschraenkung nach dem like des displaynamens. s.display_name like "like_service"' +
            CHR(10) + CHR(13) +
            'start_crit: Ist die Zeit in Sekunden die das start_time kleiner sein muss damit der Service in das Ergebnis kommt. TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < "start_crit"' +
            CHR(10) + CHR(13) +
            'sum_dif_s_e: Ist die Zeit in Sekunden die entweder der einzelne Service oder die Summe des Services critisch sein muss damit der Service in das Ergebnis kommt(mit oder ohne sum). sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) > "sum_dif_s_e"' +
            CHR(10) + CHR(13) +
            'jetzt_crit: Bestimmt ob der Service jetzt auch critisch sein muss damit er in das Ergebnis kommt. 1=ja, 0=nein' +
            CHR(10) + CHR(13) +
            'sum_o_einz: Bestimmt ob jede einzelne Zeit des Auftretens des crtitschen Service betrachtet wird oder die Summe der crtitschen Zeiten eines Services. s=summe, e=einzeln'
           );
      returncode := 3;
      returntext := 'UNKNOWN - Nicht genuegend Parameter !';
  end;
end.
Das Formularprogramm läuft einwandfrei.

Bei dem Konsolenprogramm erhalte ich folgende Fehlermeldung
"Der dbExpress-Treiber unterstützt der Datentyp TDBXTypes.UNKNOWN nicht. Fehlermeldung des Herstellers: . aufgetreten"

der Fehler tritt an dieser Stelle auf "SQLQuery1.Active := true;"

Verstehe ich nicht ist doch beides identisch.

Weis einer von Euch Rat?

Gruss Andreas
  Mit Zitat antworten Zitat