Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 无法获取使用SQL Server 2012的Delphi EventAlerter示例_Sql Server_Delphi_Firedac - Fatal编程技术网

Sql server 无法获取使用SQL Server 2012的Delphi EventAlerter示例

Sql server 无法获取使用SQL Server 2012的Delphi EventAlerter示例,sql-server,delphi,firedac,Sql Server,Delphi,Firedac,我需要检测数据库更改,并认为TFDeventalter组件将是一个好方法。Delphi 10.2 Tokyo提供的示例应用程序不适用于我。它适用于其他数据库类型。连接到MS SQL时,不会检测到单击Fire Events按钮。有人能建议做些什么改变来让它工作吗?或者,您能给我指出一个使用SQL Server的该组件的工作示例吗?FireDAC提供了两种使用SQL Server查询通知的方法。您可以让FireDAC创建\u FD_EVENTS表,监视为每个已注册事件[1](第2.1节)插入的行上的

我需要检测数据库更改,并认为TFDeventalter组件将是一个好方法。Delphi 10.2 Tokyo提供的示例应用程序不适用于我。它适用于其他数据库类型。连接到MS SQL时,不会检测到单击Fire Events按钮。有人能建议做些什么改变来让它工作吗?或者,您能给我指出一个使用SQL Server的该组件的工作示例吗?

FireDAC提供了两种使用SQL Server查询通知的方法。您可以让FireDAC创建\u FD_EVENTS表,监视为每个已注册事件[1](第2.1节)插入的行上的字段值的更新,或者指定一个SELECT查询,自事件注册[1]以来,将监视其结果集的任何更新(第2.2节)

一般来说,要使用FireDAC实现的SQL Server查询通知,必须首先为所用数据库启用它们(第1节)


1.启用通知 对于FireDAC实现的查询通知,您必须在要连接的数据库上启用Service Broker。要检查是否为您的数据库启用了Service Broker,您可以执行如下查询(可能的结果为0=禁用,1=启用):

SELECT是从sys.databases启用的,其中name='MyDatabase'
如果已禁用,请执行以下查询:

ALTER DATABASE MyDatabase SET ENABLE\u BROKER;
或者,如果您将有一些挂起的事务,您可以回滚所有挂起的事务并立即更改数据库:

alterdatabasemydatabase SET启用即时回滚的_代理;
好的,从现在开始,让我们假设您已经为您的数据库启用了ServiceBroker,并且您必须订阅通知


2.1.事件更新通知 注册由格式定义的事件[1]时,FireDAC在连接的数据库中创建\u FD\u EVENTS表(如有必要),并在该表中插入一行,该行具有名称字段值(即唯一的事件名称)将字段值设置为0。然后,每当该行的字段值为更新d时,就会触发事件

因此,如果您这样定义事件:

FDEventAlerter1.Names.Clear;
{创建临时的、唯一命名的队列和服务}
FDEventAlerter1.Names.Add('QUEUE=?');
FDEventAlerter1.Names.Add('SERVICE=?');
{以“”格式定义事件,其中:
-事件名称(作为OnAlert事件的AEventName参数传递)}
FDEventAlerter1.Names.Add('MyEvent');
您可以通过以下方式触发事件:例如,通过执行这样的查询(实际上,即使是BIGINT值也可以通过这样的查询溢出,因此请注意在生产代码中使用它):

UPDATE\u FD\u EVENTS SET Value=Value+1,其中Name='MyEvent';
格式定义的事件也可以通过代码中的方法触发(它在内部构建了如上所述的查询以触发订阅的事件)


2.2.查询结果集更新通知 另一种方法是观察注册事件时给定的SELECT查询返回的特定结果集的任何更新[1]

让我们创建一个这样的表,插入两行:

创建表客户
(
ID INT IDENTITY(1,1)主键不为空,
FirstName VARCHAR(50)不为空
);
插入客户(名字)值(“John”);
插入客户(名字)值(“Alice”);
现在,要在这两行中任何一行的FirstName字段值更改时获取通知,请在注册事件[1]之前定义如下事件格式:

FDEventAlerter1.Names.Clear;
{创建临时的、唯一命名的队列和服务}
FDEventAlerter1.Names.Add('QUEUE=?');
FDEventAlerter1.Names.Add('SERVICE=?');
{以“CHANGE=;”格式定义事件,其中:
-事件索引
-事件名称(作为OnAlert事件的AEventName参数传递)
-选择将监视其结果集进行更新的查询
更改;当此结果集更改时,事件激发}
FDEventAlerter1.Names.Add('CHANGE1=MyEvent;从客户中选择FirstName');
要触发事件,您可以更新所关注结果集中任何一行的FirstName字段的值,例如:

updatecustomers SET FirstName='Johnny',其中ID=1;
或:

updatecustomers SET FirstName='Alicia',其中ID=2;
或:

updatecustomers SET FirstName='Robert',其中ID=1;
更新客户集合FirstName='Cathie',其中ID=2;
但是,当您插入一个新行并在事件注册后更新它时,您将不会收到通知[1],无论定义的结果集实际上包含这样的行。因此,此不会通知您:

插入客户(名字)值('Barry');
更新客户集合FirstName='Barrie'其中ID=SCOPE_IDENTITY();
这意味着您实际上正在创建一种被监视的结果集快照。同样的情况也发生在格式定义的事件中,只有FireDAC创建了一个表,其中一行随后被监视,以便为您进行内部更新


3.最少的例子 下面是一个使用格式的最小示例。我假设FDEventAlerter1已分配使用SQL Server本机客户端驱动程序的连接,并已为OnAlertOnTimeout事件创建事件处理程序,如下所示: