![]() |
Datenbank: MSSQL • Version: 12 • Zugriff über: ADO
sql monitor für ADO
ich habe eine Lösung für einen ADO SQL Monitor hier
![]() In Abandlung zur Lösung oben möchte ich eine TListBox zur Anzeige der SQL Events verwenden, leider bekomme ich schon beim ersten Aufruf einen AV Fehler bei der Codezeile ListViewSQL.Items.BeginUpdate;
Delphi-Quellcode:
unit SQLMonitor; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, typinfo, Dialogs, StdCtrls, ExtCtrls, ComCtrls, , Data.DB, Data.Win.ADODB, Vcl.Buttons; type TWillExecuteEvent = procedure(const Connection: TADOConnection; var CommandText: WideString; var CursorType: TCursorType; var LockType: TADOLockType; var CommandType: TCommandType; var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset) of object; type TExecuteCompleteEvent = procedure(const Connection: TADOConnection; RecordsAffected: Integer; const Error: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset) of object; type TSQLMonitorForm = class(TForm) Panel1: TPanel; Button1: TButton; Panel2: TPanel; Label1: TLabel; ClearButton: TButton; InfoBitBtn: TBitBtn; MonitorStatusBar: TStatusBar; Panel3: TPanel; SQLMsgMemo: TMemo; ListViewSQL: TListView; MonitorTimer: TTimer; procedure Button1Click(Sender: TObject); procedure ClearButtonClick(Sender: TObject); procedure ListViewSQLChange(Sender: TObject; Item: TListItem; Change: TItemChange); procedure InfoBitBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormHide(Sender: TObject); procedure MonitorTimerTimer(Sender: TObject); private { Private-Deklarationen } FAdoConnection: TADOConnection; procedure SetAdoConnection(const Value: TFlexConnection); procedure AddLog(const Command, CommandType, Status, CursorType, LockType: String; RecordsAffected: Integer); procedure ADOConnectionExecuteComplete(Connection: TADOConnection; RecordsAffected: Integer; const LastError: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset); procedure ADOConnectionWillExecute(Connection: TADOConnection; var CommandText: WideString; var CursorType: TCursorType; var LockType: TADOLockType; var CommandType: TCommandType; var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset); public { Public-Deklarationen } property Connection: TADOConnection read FAdoConnection write SetAdoConnection; end; var SQLMonitorForm: TSQLMonitorForm; implementation {$R *.dfm} procedure TSQLMonitorForm.ADOConnectionWillExecute(Connection: TADOConnection; var CommandText: WideString; var CursorType: TCursorType; var LockType: TADOLockType; var CommandType: TCommandType; var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset); begin SQLMonitorForm.AddLog(CommandText, 'Before ' + GetEnumName(TypeInfo(TCommandType), Integer(CommandType)), GetEnumName(TypeInfo(TEventStatus), Integer(EventStatus)), GetEnumName(TypeInfo(TCursorType), Integer(CursorType)), GetEnumName(TypeInfo(TADOLockType), Integer(LockType)), 0); end; procedure TSQLMonitorForm.ADOConnectionExecuteComplete (Connection: TADOConnection; RecordsAffected: Integer; const LastError: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset); begin SQLMonitorForm.AddLog(Command.CommandText, 'After ' + GetEnumName(TypeInfo(TCommandType), Integer(Command.CommandType) ), GetEnumName(TypeInfo(TEventStatus), Integer(EventStatus)), GetEnumName(TypeInfo(TCursorType), Integer(Recordset.CursorType)), GetEnumName(TypeInfo(TADOLockType), Integer(Recordset.LockType)), RecordsAffected); end; procedure TSQLMonitorForm.AddLog(const Command, CommandType, Status, CursorType, LockType: String; RecordsAffected: Integer); var Item: TListItem; begin ListViewSQL.Items.BeginUpdate; try Item := ListViewSQL.Items.Add; Item.Caption := FormatDateTime('DD/MM/YYYY HH:NN:SS.ZZZ', Now); Item.SubItems.Add(CommandType); Item.SubItems.Add(Command); Item.SubItems.Add(Status); Item.SubItems.Add(IntToStr(RecordsAffected)); Item.SubItems.Add(CursorType); Item.SubItems.Add(LockType); finally ListViewSQL.Items.EndUpdate; end; ListViewSQL.Items.Item[ListViewSQL.Items.Count - 1].MakeVisible(false); // Scroll to the last line MonitorStatusBar.SimpleText := ' ***** ' + Item.Caption + ' ! ' + FormatDateTime('DD/MM/YYYY HH:NN:SS.ZZZ', Now); end; procedure TSQLMonitorForm.Button1Click(Sender: TObject); begin SQLMonitorForm.Close; end; procedure TSQLMonitorForm.ClearButtonClick(Sender: TObject); begin SQLMsgMemo.Clear; end; procedure TSQLMonitorForm.FormHide(Sender: TObject); begin MonitorTimer.Enabled := false; end; procedure TSQLMonitorForm.FormShow(Sender: TObject); begin MonitorTimer.Enabled := true; end; procedure TSQLMonitorForm.InfoBitBtnClick(Sender: TObject); begin SQLMsgMemo.Lines.Clear; SQLMsgMemo.Lines.Add(datetostr(Now) + TimeTostr(Now)); SQLMsgMemo.Lines.Add(FAdoConnection.ConnectionString); SQLMsgMemo.Lines.Add(Booltostr(FAdoConnection.Connected)); end; procedure TSQLMonitorForm.ListViewSQLChange(Sender: TObject; Item: TListItem; Change: TItemChange); begin if (ListViewSQL.Selected <> nil) then SQLMsgMemo.Lines.text := ListViewSQL.Selected.SubItems[1]; // SQLMsgmemo.Lines.add (Item.subitems[1]); end; procedure TSQLMonitorForm.MonitorTimerTimer(Sender: TObject); begin MonitorStatusBar.SimpleText := ' Date ' + datetostr(Now) + ' / ' + TimeTostr(Now); end; procedure TSQLMonitorForm.SetAdoConnection(const Value: TADOConnection); begin FAdoConnection := Value; FAdoConnection.OnWillExecute := SQLMonitorForm.ADOConnectionWillExecute; FAdoConnection.OnExecuteComplete := SQLMonitorForm.ADOConnectionExecuteComplete; end; end. Aufruf wie folgt
Delphi-Quellcode:
var
SQLMonitorForm: TSQLMonitorForm; begin try SQLMonitorForm := TSQLMonitorForm.Create(self); SQLMonitorForm.Connection := MainDBConnection; SQLMonitorForm.Show; finally // SQLMonitorForm.free; end; . |
AW: sql monitor für ADO
Du erzeugst die Unterkomponenten ja auch nicht ( onCreate-Event)
|
AW: sql monitor für ADO
welche UnterKomponente, ich sehe den Fehler noch nicht :(
FAdoConnection sollte ja die Komponente vom Hauptformular sein , deshalb kein .Create(...) in diesem Form |
AW: sql monitor für ADO
Verwende
Delphi-Quellcode:
statt '
Application.CreateForm(SQLMonitorForm, TSQLMonitorForm)
Delphi-Quellcode:
'.
SQLMonitorForm := TSQLMonitorForm.Create(...)
WEiterhin ist es wirklich fatal, in einer Methode einer Form eine explizite Instanz der Form aufzurufen. Das hier ist ein No-go:
Delphi-Quellcode:
Lieber so;
procedure TSQLMonitorForm.Button1Click(Sender: TObject);
begin SQLMonitorForm.Close; end;
Delphi-Quellcode:
procedure TSQLMonitorForm.Button1Click(Sender: TObject);
begin Self.Close; // oder einfach nur Close(); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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-2025 by Thomas Breitkreuz