Autor Beitrag
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Mi 07.09.11 18:25 
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!
ausblenden 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
ausblenden 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.
ausblenden 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?


Zuletzt bearbeitet von Singlepin am Do 08.09.11 17:59, insgesamt 1-mal bearbeitet
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Singlepin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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 :

ausblenden 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);  // pure printable chars
  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.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Singlepin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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).

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw