Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Not-Abfragewird 2mal ausgeführt (https://www.delphipraxis.net/192026-not-abfragewird-2mal-ausgefuehrt.html)

Delbor 14. Mär 2017 14:43

Delphi-Version: XE8

Not-Abfragewird 2mal ausgeführt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

Eben hab ich ein seltsames Problem etdeckt; zumindest hab ich keine Erklärung dafür und weiss deshalb auch nicht, wo ich den Fehler suchen könnte.

Beim Aufstarten wird erstmal die Createmethode des Datenmoduls aus dem OnCreateEvent des Hauptformulars aufgerufen:

Delphi-Quellcode:
procedure TFDMySQLDml.DataModuleCreate(Sender: TObject);
  var LIndent : String;
begin
  LIndent := '   -  ';
  CM_First.ProcedureReport.Add('PROCEDURE TFDMySQLDml.DataModuleCreate');
  CM_First.ProcedureReport.Add('--------------------------------------');
  FQueryResultList := TObjectList.Create;
  TPicture.RegisterFileFormat('NEF','NEF Format',TWICImage);
  FReportlist := TStringlist.Create;
  FSessionVarList := TStringlist.Create;
  FCategoryBildList := TDataObjectList<TQueryResultClass>.Create();
  FCategoryList := TDataObjectList<TQueryResultClass>.Create();
  FPathList := TStringList.Create;
  FMySQLCorrespondent := TMySQLCorrespondent.Create(Self);     // TFDMySQLDml
  FHost := 'localhost';
  FDataBase := 'contentmasterdata';
  FServerDB := 'performance_schema';
  FPort := '3306';
  if not DefineContentmasterConnection then   //<==
  begin;
    ShowMessage(' Die Verbindung konnte nicht hergestellt werden');
    // An dieser Stellle muss geeignet reagiert werden können
  end;
  FPerformanceSchemaTables := TStringList.Create;
  ShowCharactersets;  //TFDMySQLDml       Muss nach TMysqlkorrespondent verlagert werden
  GetMaxAllowedPacket;
end;
An der bezeichneten Stelle wird die Booleanfunktion aufgerufen:
Delphi-Quellcode:
 function TFDMySQLDml.DefineContentmasterConnection: Boolean;
  var LIndent : String;
begin
  if (FHost <> 'localhost') or (FDataBase <> 'contentmasterdata') then
    Exit;
  LIndent := '   -  ';
  FDConnectionMySQL.Close;
  FDConnectionMySQL.Params.Clear;
  FDConnectionMySQL.Params.Add('DriverID=MySQL');
  FDConnectionMySQL.Params.Add('Server=' + FHost);
  FDConnectionMySQL.Params.Add('Port=' + FPort);
  FDConnectionMySQL.Params.Add('Database=contentmasterdata');
  FDConnectionMySQL.Params.Add('User_Name=root');
  FDConnectionMySQL.Open;
  Result := True;
end;
Anschliessend kehrt die Programmfunktion zurück und überspringt korrekterweise die Showmessage-Anweisung - die Verbindung ist also hergestellt.
Im weiteren Verlauf wird ShowCharactersets und MaxallowedPacket aufgerufen.
Das Problem ist: DefineContentmasterConnection liefert False zurück!

Inzwischen vermute ich meine Verbindungsdefinitionen als Ursache. Im Anhang ein Jpeg der OI-Einstellungen der Connection-Komponente:
Ansonsten: Was mache ich falsch?

Gruss
Delbor

bra 14. Mär 2017 15:38

AW: Not-Abfragewird 2mal ausgeführt
 
Der Rückgabewert von DefineContentmasterConnection ist undefiniert vor dem Exit. Möglicherweise ist das das Problem?

Delphi-Quellcode:
 function TFDMySQLDml.DefineContentmasterConnection: Boolean;
  var LIndent : String;
begin
  Result := False;
  if (FHost <> 'localhost') or (FDataBase <> 'contentmasterdata') then
    Exit;
  ..

  Result := True;
end;

Delbor 14. Mär 2017 16:38

AW: Not-Abfragewird 2mal ausgeführt
 
Hi zusammen

@Bra: Ich hab das Result := False; mal eingefügt. Allerdings hatte ich noch einen kleinen Test vor:
Delphi-Quellcode:
procedure TServerInfoFrame.Button2Click(Sender: TObject);
  var ConnOk : String;
begin
  if FDMySQLDml.FDConnectionMySql.Connected then
    ConnOK := 'FDMySQLConnection := True;'
  else
    ConnOK := 'FDMySQLConnection := False;';
  Showmessage(ConnOK);
end;
Vorgängig hatte ich meinen Funktionsaufruf deaktiviert:
Delphi-Quellcode:
//  if not FDMySQLDml.DefineContentmasterConnection then ;
//  begin;
//    ShowMessage(' Die Verbindung konnte nicht hergestellt werden');
//    // An dieser Stellle muss geeignet reagiert werden können
//  end;
////  FDMySQLDml.DefineContentmasterConnection;
Die da festgelegte Verbindungsdefinition wurde also nicht ausgeführt.
Jetzt gab ConnOK True zurück.

Dabbei wurden offensichtlich die Definitionen aus dem OI verwendet. Nicht ganz verstanden habe ich, wieso meine eigen Funktion False zurückgibt, da ich an Result ja explizit True zugewiesen habe.

Gruss
Delbor

Uwe Raabe 14. Mär 2017 16:41

AW: Not-Abfragewird 2mal ausgeführt
 
Zitat:

Zitat von Delbor (Beitrag 1364185)
Dabbei wurden offensichtlich die Definitionen aus dem OI verwendet.

Du hast einen ConnectionDefName zugewiesen. Vermutlich wurde dann wohl auch diese Definition verwendet.

Delbor 14. Mär 2017 16:53

AW: Not-Abfragewird 2mal ausgeführt
 
Hi Uwe Raabe

Irgendwie vermutete ich schon, dass ich die Felder im OI allesamt leeren müsste, um eine temporäre Verbindungsdefinition verwenden zu können, war mir dessen aber alles andere als sicher.

Gruss
Delbor

sko1 15. Mär 2017 07:08

AW: Not-Abfragewird 2mal ausgeführt
 
Dann lass doch den ganzen OI außen vor und erzeuge Deine Connection usw. im Code.
Dann weißt Du auch selbst ganz genau welche Propertys Du wie eingestellt hast.

Ciao
Stefan


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