Entwickler-Ecke
Datenbanken - SQL-Monitor für DAc von microOLAP
Singlepin - Mi 07.09.11 18:25
Titel: SQL-Monitor für DAc von microOLAP
Hallo Forum Gemeinde,
ich arbeite mit DAC vom microOLAP.
Benutze ich die Komponente mySQLMonitor möchte ich die Ergebnisse in eine Datei speichern.
Folgendes geht!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TMain.MySQLMonitor1SQL(const Application, Database, Msg, SQL, ErrorMsg: String; DataType: TMySQLTraceFlag; const ExecutedOK: Boolean; EventTime: TDateTime); begin Memo1.Lines.Add(Msg); Memo1.Lines.Add(SQL); Memo1.Lines.Add(ErrorMsg); Memo1.Lines.Add(DateTimeToStr(EventTime)); end; |
mit
Delphi-Quelltext
1:
| Memo1.Lines.SaveToFile('test.txt'); |
kann ich die Daten speichern.
Die arbeit über ein TMemo ist mir zu umständlich, die Lösung sollte als Stream möglich sein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var Stream1: TStream; ... procedure TMain.FormCreate(Sender: TObject); begin ... Stream1 := TFileStream.Create('Test.txt', fmCreate); ... end;
procedure TMain.MySQLMonitor1SQL(const Application, Database, Msg, SQL, ErrorMsg: String; DataType: TMySQLTraceFlag; const ExecutedOK: Boolean; EventTime: TDateTime); begin Stream1.Write(PChar(Msg)^,length(msg); ... end; |
bringt folgenden Fehler:
Im Projekt ... ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse ...
in Modul .... Lesen von Adresse 00000000'...
selbst Stream1.Write('123',3) geht nicht, auch wenn ich mit TStringList arbeite der selbe Fehler.
Wie kriegen wir das hin?
HelgeLange - Mi 07.09.11 20:06
Die Fehlermeldung sagt, dass Du auf ein Objekt zugreifst, welches nicht initialisiert ist.
Einfach mal im Debugger step-by-step durchflitzen und schaun, welches objekt das ist.
Singlepin - Mi 07.09.11 20:35
So einfach ist das nicht.
Gehe ich mit dem Dedugger durch werden die Daten einwandfrei angezeigt und in dem Stream geschrieben.
Setze ich z.B. den Befehl Stream1.Write('123',3) außerhalb der Ereignisbehandelung-Routine ein geht auch alles.
Mehr als das ich einen Stream öffne ist eigentlich nicht.
Das Programm selbst läuft ohne aktiven SQLMonitor fehlerfrei.
HelgeLange - Do 08.09.11 16:02
Naja, dein code gibt nicht viel her. Ich sehe nur, dass die Erstellung des Streams und das schreiben in 2 unterschiedlichen Objekten erfolgt (TForm1 und TMain), vllt ist TForm1 einfach nicht nicht initialisiert gewesen und der Stream deswegen nicht erstellt.
Der Fehler mit dem Lesen von Adresse 0000000 war in meinem ganzen Delphi Programmiererleben (bin seit Delphi 2 dabei) IMMER ein Zugriff auf ein nicht-erzeugtes Objekt/Speicherbereich.
Das mit dem Schreiben in den Stream bin ich mir nicht sicher, dass es so einfach geht, ohne es auszuprobieren. Ich habe das anders in meinem Code :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TTemplateStreamer.WriteString(S: String); var i : Integer; b : Byte; begin If SizeOf(Char) = 1 Then b := sdtString Else b := sdtWideString; FStream.Write(b, SizeOf(Byte)); i := Length(S); FStream.Write(i, SizeOf(Integer)); FStream.Write(Pointer(S)^, Length(S) * SizeOf(Char)); end; |
Du siehst, ich wandle den string in einen PChar und dereferenziere diesen, um den String zu schreiben.
Singlepin - Do 08.09.11 18:26
Hallo HelgeLange,
habe meinen Code korrigiert (siehe Oben). Kopieren wäre besser gewesen.
Ich habe es gerade noch einmal getestet.
Mit dem Debugger Schritt für Schritt wird der Stream geschrieben.
Ohne Debugger kommt der besagte Fehler.
Auffällig ist auch, daß in der Datei beim debuggen nicht alle SQL-Befehle Protokolliert werden.
Es fehlt gleich der erste Befehl "Connect", der Rest scheint korrekt zu sein.
So und nun zu guter letzt noch ein Test mit dem Debugger und auch da wieder der Fehler.
Ich glaub ich laß es.
Singlepin - Do 08.09.11 19:25
Ziehe hiermit meine Frage beschämt zurück.
Der Fehler war tatsächte darin, das der Monitor bereits Ereignisse aufzeichnen wollte bevor in onCreate der Stream geöffnet wurde.
HelgeLange - Fr 09.09.11 17:04
Sagte ich ja :)
Erinnere Dich auch dran, dass Length(Msg) Dir nur die Anzahl der Zeichen, nicht die der Byte zurück gibt. Wenn Du in Unicode das ganze machst (Delphi 2009+), dann schreibt er Dir nur die hälfte oder weniger (weil Unicode mind. 2 byte pro Zeichen nutzt).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!