Thema: Delphi TFDEventAlerter HowTo

Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.932 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

TFDEventAlerter HowTo

  Alt 28. Mai 2021, 07:14
Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC
Hallo...

Mein letzter Strohhalm...euch zu fragen.

SOLL:
Die Datenbank "soll" ein Event (pro Tabelle) auslösen. Der Client soll dann seine Datenmenge aktualisieren können.

IST:
Ich habe alles ausprobiert...es wird kein Event ausgelöst.

Infos:

http://docwiki.embarcadero.com/RADSt...ngen_(FireDAC)
http://docwiki.embarcadero.com/RADSt...ngen_(FireDAC)

Beispiel ausprobiert:
https://stackoverflow.com/questions/...ql-server-2012

Ich habe mich für die Variante "_FD_EVENTS UPDATE notification" entschieden.

1. Broker ist on
2. _FD_EVENTS Tablelle wurde erstellt
3. 'evtUsers' Event wurde als Datensatz in der Tabelle angelegt (über Register der Komponente)
(Die Komponente versucht jedesmal den Datensatz anzulegen -> stille Exception bei Vorhandensein...macht Spaß im Debug. )
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EMSSQLNativeException mit der Meldung '[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL Server]Verletzung der PRIMARY KEY-Einschränkung "PK___FD_EVEN__737584F7CB96DC61". Ein doppelter Schlüssel kann in das dbo._FD_EVENTS-Objekt nicht eingefügt werden. Der doppelte Schlüsselwert ist (evtUsers).' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EMSSQLNativeException mit der Meldung '[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0]OZum Festlegen dieses Attributs müssen bestimmte andere Attribute festgelegt werden. Einstellung des Attributs wird ignoriert.' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
4. Signal function der Komponente erhöht den Wert des Values
5. TFDPhysMSSQLDriverLink wird der gebraucht?
6. Beim Beenden oder Close kommt eine stille Exception bei der Freigabe des Threads der Komponente.
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x004c893c: read of address 0x0000003c' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Delphi-Quellcode:
procedure TFDPhysMSSQLEventAlerter.InternalAbortJob;
begin
  FWaitThread.Terminate; // <- hier
  FWaitCommand.AbortJob(True);
end;

Ergebnis:

kein Event wird ausgelöst.

Was habe ich vergessen? Was ist falsch?

Wie kommt denn der Broker von MSSQL ins Spiel? Der Alerter braucht doch nur im Task den Wert des Values vergleichen und das Event auslösen..oder?


Testcode:
Delphi-Quellcode:
procedure TForm1.ale1Alert(ASender: TFDCustomEventAlerter; const AEventName: string; const AArgument: Variant);
begin
  qry1.Refresh;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  con1.Connected := True;

  qry1.SQL.Text := 'select * from Users';
  qry1.Open;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  con1.Close;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  ale1.Signal('evtUsers', 1);
end;
Delphi-Quellcode:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 511
  ClientWidth = 933
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  DesignSize = (
    933
    511)
  PixelsPerInch = 96
  TextHeight = 13
  object grd1: TDBGrid
    Left = 32
    Top = 88
    Width = 889
    Height = 401
    Anchors = [akLeft, akTop, akRight, akBottom]
    DataSource = ds1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object btn1: TButton
    Left = 32
    Top = 40
    Width = 75
    Height = 25
    Caption = 'Open'
    TabOrder = 1
    OnClick = btn1Click
  end
  object btn2: TButton
    Left = 113
    Top = 40
    Width = 75
    Height = 25
    Caption = 'Close'
    TabOrder = 2
    OnClick = btn2Click
  end
  object btn3: TButton
    Left = 264
    Top = 40
    Width = 75
    Height = 25
    Caption = 'btn3'
    TabOrder = 3
    OnClick = btn3Click
  end
  object con1: TFDConnection
    Params.Strings = (
      'DriverID=MSSQL'
      'MARS=No'
      'Server=XXX'
      'User_Name=Blubb'
      'Password=Test'
      'Database=Bla')
    Connected = True
    LoginPrompt = False
    Left = 824
    Top = 24
  end
  object qry1: TFDQuery
    Connection = con1
    Left = 32
    Top = 200
  end
  object ds1: TDataSource
    DataSet = qry1
    Left = 80
    Top = 200
  end
  object ale1: TFDEventAlerter
    Connection = con1
    Names.Strings = (
      'evtUsers')
    SubscriptionName = 'Events'
    Options.AutoRegister = True
    Options.MergeData = dmNone
    Options.AutoRefresh = afNone
    OnAlert = ale1Alert
    Left = 824
    Top = 80
  end
  object lnk1: TFDPhysMSSQLDriverLink
    Left = 760
    Top = 24
  end
end

Geändert von haentschman (28. Mai 2021 um 07:33 Uhr)
  Mit Zitat antworten Zitat