Kennisbank

Delphi en database events

Delphi en Microsoft SQL Server events

Database events zijn een erg handig manier om applicaties te laten weten dat er een bepaalde gebeurtenis zich heeft voorgedaan. In plaats van de applicatie continue naar de database te laten ‘pollen’, krijg je via een event precies op het juiste moment een seintje dat je vanuit de database dat je actie moet ondernemen. Als voorbeeld; stel dat een applicatie een wijziging maakt in een specifiek klantenrecord, wat ervoor zorgen moet dat in een andere applicatie een handeling verricht moet worden. De andere applicatie hoeft met events alleen maar te wachten op het specifieke event, en hoeft niet continu een SQL-statement uit te voeren om te zien of het record aangepast is.

FDEventAlerter

Binnen Delphi (of eigenlijk binnen FireDAC) kun je dit oplossen voor middel van het component FDEventAlerter. Dit component is gemaakt om te ‘luisteren’ naar events binnen een database omgeving. Het mooie van het FDEventAlerter component is dat het gemaakt is om één ‘interface’ te geven, onafhankelijk welke database je gebruikt. Je kunt met deze interface zelf bepalen of je op een specifiek event wacht, of zelf op een wijziging in specifiek record in een tabel.

Voorbeeld met Microsoft SQL Server

In het voorbeeld hieronder maken we gebruik van een Microsoft SQL Server. Om de events bij Microsoft SQL Server te kunnen versturen kun je gebruik maken van de Query Notifications.

Om deze Query Notifications aan te maken kunnen we de volgende code gebruiken:

-- Create the queue and the service
CREATE QUEUE [NotificationsQueue];
CREATE SERVICE [NotificationsService] ON QUEUE [NotificationsQueue] (
[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]
);
GRANT SEND ON SERVICE::[NotificationsService] TO [];


-- Permissions needed for []
GRANT SELECT to []
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO []
GRANT RECEIVE ON QueryNotificationErrorsQueue TO []
GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to []
GRANT RECEIVE ON [NotificationsQueue] TO []
GRANT VIEW DEFINITION TO []

Zodra deze zaken geregeld zijn kunnen we in Delphi de implementatie van het event systeem uitvoeren. Dit doe je door het FDEventAlerter component op een form of datamodule te plaatsen, en deze via de property Connection te koppelen aan je database. Ook moet je door middel van de Names property de queue, service en change events zetten:

FDEventAlerter.Connection := ''
FDEventAlerter.Names.Add('QUEUE=NotificationsQueue');
FDEventAlerter.Names.Add('SERVICE=NotificationsService');

Vervolgens kun je de OnAlert event handler van het component gebruiken om via onderstaande code de events af te vangen en actie te ondernemen:

procedure TFrmMain.FDEventAlerterAlert(ASender: TFDCustomEventAlerter; const AEventName: string;
  const AArgument: Variant);
begin
  mmLog.Lines.Add('Event - [' + AEventName + '] - [' + AArgument + ']');
end;

 

Specifiek voor Microsoft SQL Server moet je de service-broker aanzetten (ALTER DATABASE <your db name> SET ENABLE_BROKER), anders worden er geen events gedeeld met de queue en dus ook geen alerts opgevangen door de FDEventAlerter. Dit staat ook beschreven in https://docwiki.embarcadero.com/RADStudio/Sydney/en/Database_Alerts_(FireDAC) bij Microsoft SQL Server.

Per gebruiker van een FDEventAlerter is er een queue en service nodig. De FDEventAlerter zal deze queue en service aanmaken op het default schema van de user van de ingelogde gebruiker. Hierdoor is het dus noodzakelijk om rechten te hebben voor de user van de ingelogde gebruiker, zodat deze kunnen aanmaken. De queue en service zullen een unieke naam toegewezen krijgen, wanneer deze niet zijn gegeven. Na afsluiten of unregisteren van de FDEventAlerter ruimt het component de zelf aangemaakte unieke queue en service op.

Geschreven door Remco Vorthoren
Delphi ontwikkelaar

Contact

Laat ons helpen jouw ambities concreet te maken.