Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MyDac "show status" antwort abhohlen (https://www.delphipraxis.net/178370-mydac-show-status-antwort-abhohlen.html)

DelTurbo 4. Jan 2014 10:35

Datenbank: MySql • Version: 5.x • Zugriff über: MyDac

MyDac "show status" antwort abhohlen
 
Hi,
ich brauche mal eine kleine Hilfe. Ich hab nun MyDac. Die Demo die bei ist, ist sehr groß. Da was zu finden scheint nicht einfach zu sein.

Ich habe auf der Form nun TMyConnection, TMySQLMonitor und TMyQuery. Nun habe ich folgendes gemacht, um erstmal reinzukommen.

Delphi-Quellcode:
    MyQuery1.SQL.Add('show status;');
    MYQuery1.ExecSQL;
Nun finde ich leider nicht, wo bzw. wie ich die antwort abhohlen kann. Wenn jemand so nett wäre um mir mit einem 3zeiler aushelfen könnte, wäre ich wahnsinnig dankbar.

Danke im voraus

Sir Rufo 4. Jan 2014 10:45

AW: MyDac "show status" antwort abhohlen
 
Delphi-Quellcode:
MyQuery1.Open
?

RWarnecke 4. Jan 2014 10:46

AW: MyDac "show status" antwort abhohlen
 
Probiere mal folgendes :
Delphi-Quellcode:
MyQuery1.SQL.Clear;
MyQuery1.SQL.Add('SHOW Status;');
MyQuery1.Open;
while not MyQuery1.Eof do
begin
  Memo1.Lines.Add(MyQuery1.FieldsByName('VariableName').AsString + ' = ' + MyQuery1.FieldsByName('Value').AsString);
  MyQuery1.Next;
end;
MyQuery1.Close;
(Nur so runtergetippt.)

Nun sollten Dir alle Werte in einem Memo angezeigt werden.

DelTurbo 4. Jan 2014 10:59

AW: MyDac "show status" antwort abhohlen
 
@RWarnecke,
das ist schonmal ein Anfang. Ich danke dir. Bei FieldByName ist nur das s zuviel. Nun muss ich nur noch finden (Anzahl ist 25 laut MyQuery1.FetchRows) wie ich an die Feldnamen komme.

Vielen dank erstmal :thumb:

EDIT:
Aus 'VariableName' noch 'Variable_Name' machen, dann rennt deine demo einwanfrei. Nochmals vielen dank!

Sir Rufo 4. Jan 2014 11:18

AW: MyDac "show status" antwort abhohlen
 
Jedes DataSet lässt dich durch die Felder iterieren um z.B. an die Feldnamen zu kommen.

Einfach mal schauen nach Delphi-Referenz durchsuchenTDataSet.Fields -> Delphi-Referenz durchsuchenTFields

DelTurbo 4. Jan 2014 11:27

AW: MyDac "show status" antwort abhohlen
 
Danke. Ich habe bisher immer mit DirectMySql etwas gemacht. Deswegen stand ich grade etwas wie "Ochse vorm Berg".

Aber da DirectMySql nur bis SSL Verion 0.9.6 rennt, wollte ich umsteigen. Und Deddy hat mir den Tipp mit Devart gegeben.

Da muss ich mich erstmal "reinfummeln". Da ich aber nun die "Grunsätzlichen" sachen kenne, wird wohl 1% von dem sein was MyDac kann, geht es nun aufwärts.

Das ist einfach frustrierend wenn man Stunden lang etwas versucht bzw. sucht und findet es nicht.

Nochmal danke

DelTurbo 5. Jan 2014 11:51

AW: MyDac "show status" antwort abhohlen
 
Hallo, ich habe noch eine frage. Das MyQuery.Open, braucht man das? Wenn SQL leer ist, gibt es einen fehler. Aber wenn ich etwas in SQL drin habe, kann ich sofort das Execute ohne open machen. Ich habe mal eine kleine schleife gemacht, die mir alle Datenbanke gibt, und dann alle Tabellen ausliest.

Wäre nett wenn mir jemdand sagen könnte ob man das so lassen kann, oder ob ich zu kompliziert gedacht habe.

Danke im voraus

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  line   :String;
begin
    MyConnection1.Connect;
    MyQuery1.SQL.Clear;
    Memo1.Clear;
    MyQuery1.SQL.Add('SHOW DATABASES;');
    MyQuery1.Open;
    MyQuery1.First;
//    MyQuery2.Open;
    while not MyQuery1.Eof do
    begin
      line:=MyQuery1.FieldList.Fields[0].AsString;
      Memo1.Lines.Add(MyQuery1.FieldList.Fields[0].AsString);
      MYQuery2.SQL.Clear;
      MyQuery2.SQL.Add('SHOW TABLES FROM '+line+';');
      MyQuery2.Execute;
      while ( not MyQuery2.Eof ) do begin
        Memo1.Lines.Add(MyQuery2.FieldList.Fields[0].AsString);
        MyQuery2.Next;
      end;
      MyQuery1.Next;
    end;
    MyQuery1.Close;
    MyQuery2.Close;
    MyConnection1.Disconnect;
end;

haentschman 5. Jan 2014 12:26

AW: MyDac "show status" antwort abhohlen
 
Moin...

Grundsätzliches:
1. Open führt einen Befehl aus und bekommt eine Ergebnismenge zurück.
2. Execute führt nur einen Befehl aus.

...jetzt müßtest du deinen Fehler auch finden :zwinker:

DelTurbo 5. Jan 2014 12:32

AW: MyDac "show status" antwort abhohlen
 
Die frage die ich mir gestellt habe, ist, dauert das ewige Open/Close nicht zu lange? Zumal das ja denn in einer Schleife wäre.

Sir Rufo 5. Jan 2014 12:36

AW: MyDac "show status" antwort abhohlen
 
Mal ganz abgesehen davon, dass man solche Operationen nicht mit Komponenten (
Delphi-Quellcode:
MyQuery1
,
Delphi-Quellcode:
MyQuery2
) machen sollten, die man auf eine Form klatscht ist es auch besser diese Funktionen aufzuteilen.
Delphi-Quellcode:
  procedure GetDatabaseNames( AConnection : TMyConnection; AResult : TStrings );
    var
      LQuery : TMyQuery;
      LField : TField;
    begin
      AResult.BeginUpdate;
      try

        AResult.Clear;

        LQuery := TMyQuery.Create( nil );
        try
          LQuery.SQL.Text  := 'SHOW DATABASES';
          LQuery.Connection := AConnection;
          LQuery.Open;
          try
            LField := LQuery.FieldByName( 'Database' );

            while not LQuery.EOF do
              begin
                AResult.Add( LField.AsString );
                LQuery.Next;
              end;
          finally
            LQuery.Close;
          end;
        finally
          LQuery.Free;
        end;

      finally
        AResult.EndUpdate;
      end;
    end;

  procedure GetTableNames( AConnection : TMyConnection; const ADatabaseName : string; AResult : TResult );
    var
      LQuery : TMyQuery;
      LField : TField;
    begin
      AResult.BeginUpdate;
      try

        AResult.Clear;

        LQuery := TMyQuery.Create( nil );
        try
          LQuery.SQL.Text  := 'SHOW TABLES FROM ' + ADatabaseName;
          LQuery.Connection := AConnection;
          LQuery.Open;
          try
            LField := LQuery.Fields.Fields[0];

            while not LQuery.EOF do
              begin
                AResult.Add( LField.AsString );
                LQuery.Next;
              end;
          finally
            LQuery.Close;
          end;
        finally
          LQuery.Free;
        end;

      finally
        AResult.EndUpdate;
      end;
    end;

  procedure GetDatabaseTableNames( AConnection : TMyConnection; AResult : TStrings );
    var
      LDatabases : TStringList;
      LDatabase : string;
      LTables   : TStringList;
      LTable    : string;
    begin
      LDatabases := nil;
      LTables   := nil;
      AResult.BeginUpdate;
      try
        AResult.Clear;

        LDatabases := TStringList.Create;
        LTables   := TStringList.Create;

        GetDatabaseNames( AConnection, LDatabases );

        for LDatabase in LDatabases do
          begin
            GetTableNames( AConnection, LDatabase, LTables );

            for LTable in LTables do
              begin
                AResult.Add( Format( '%s.%s', [LDatabase, LTable] ) );
              end;
          end;

      finally
        AResult.EndUpdate;
        LTables.Free;
        LDatabases.Free;
      end;
    end;

  procedure TForm1.Button1Click( Sender : TObject );
    begin
      GetDatabaseTableNames( MyConnection1, Memo1 );
    end;

Sir Rufo 5. Jan 2014 12:44

AW: MyDac "show status" antwort abhohlen
 
Zitat:

Zitat von DelTurbo (Beitrag 1242210)
Die frage die ich mir gestellt habe, ist, dauert das ewige Open/Close nicht zu lange? Zumal das ja denn in einer Schleife wäre.

Wenn du mehrfach Daten zeilenweise in ein
Delphi-Quellcode:
TMemo
schreibst ohne
Delphi-Quellcode:
TMemo.Lines.BeginUpdate
und
Delphi-Quellcode:
TMemo.Lines.EndUpdate
, dann brauchst du dir auch keine Sorgen über das Open/Close Laufzeit-Verhalten machen ;)

Wenn du dir jetzt noch Gedanken über das ständige Erzeugen von den Query-Objekten machst, dann solltest du über ein
Delphi-Quellcode:
TObjectPool
nachdenken ;)

DelTurbo 5. Jan 2014 12:50

AW: MyDac "show status" antwort abhohlen
 
Das "draufklatschten" mache ich meistens, wenn ich was neues probiere. Da habe ich dann eine Fehlerquelle weniger. Es ging nun im grunde nur darum ob der reine kern, also der denkansatz richtig ist.

Das man ein begin und endupdate macht, weiß ich.

Aber vielen dank für deine Hilfe. Nun weiß ich das ich nicht zu 100% falsch liege. Das was ich gemacht habe ist auch nicht "schön". Das weiß ich auch. Es ging halt nur um den weg selber.

Ich werde mir deine "demo" mal "einverleiben" :thumb:

Sir Rufo 5. Jan 2014 13:44

AW: MyDac "show status" antwort abhohlen
 
Also ob der Denkansatz "richig" weiß ich nicht, dazu müsste man wissen, was du möchtest ;)

Delphi-Quellcode:
TMyConnection
bietet dir auch eine Möglichkeit alle Tabellennamen der aktuellen Datenbank abzufragen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz