gpt4 book ai didi

c# - SqlDependency立即触发

转载 作者:太空狗 更新时间:2023-10-29 17:54:55 25 4
gpt4 key购买 nike

我想使用SqlDependency在其他使用数据库的应用程序更改某些数据时获取通知。

public class DatabaseChangesNotification : IDisposable
{
private static string chaineDeConnexion = ConfigurationManager.ConnectionStrings["TransfertContext"].ConnectionString;

private static readonly Lazy<DatabaseChangesNotification> _instance = new Lazy<DatabaseChangesNotification>(() => new DatabaseChangesNotification());

private DatabaseChangesNotification()
{
System.Diagnostics.Trace.WriteLine("--- SqlDependency START ---");
SqlDependency.Start(chaineDeConnexion);
}

public void Dispose()
{
System.Diagnostics.Trace.WriteLine("--- SqlDependency STOP ---");
SqlDependency.Stop(chaineDeConnexion);
}

public static DatabaseChangesNotification Instance
{
get
{
return _instance.Value;
}
}

public void AbonnerNotification(string requete, OnChangeEventHandler eventhandler)
{
using (SqlConnection connection = new SqlConnection(chaineDeConnexion))
{
using (SqlCommand command = new SqlCommand(requete, connection) { Notification = null }) // clear existing notifications
{
connection.Open();

var sqlDependency = new SqlDependency(command);

OnChangeEventHandler delegateAutoRemove = null;
delegateAutoRemove = (sender, e) => {
var dependency = sender as SqlDependency;
dependency.OnChange -= delegateAutoRemove;
eventhandler(sender, e);
};

sqlDependency.OnChange += delegateAutoRemove;

command.ExecuteNonQuery();
}
}
}
}

因此,我可以用一行代码注册一个事件处理程序:
DatabaseChangesNotification.Instance.AbonnerNotification(@"SELECT IdUtilisateur, Code, Nom, Prenom, NomComplet, Login, Synchroniser FROM dbo.Utilisateur", OnChanges);  

public void OnChanges(object sender, SqlNotificationEventArgs e){
System.Diagnostics.Trace.WriteLine("------------------------------ UPDATTEEEE -------------------------");
System.Diagnostics.Trace.WriteLine("Info: " + e.Info.ToString());
System.Diagnostics.Trace.WriteLine("Source: " + e.Source.ToString());
System.Diagnostics.Trace.WriteLine("Type: " + e.Type.ToString());

GlobalHost.ConnectionManager.GetHubContext<TransfertClientHub>().Clients.All.hello("users modified !");
//AbonnementChanges();
}

但我的问题是通知是立即发出的:
--- ABONNEMENT ---
------------------------------ UPDATTEEEE -------------------------
Info: Query
Source: Statement
Type: Subscribe

这就是我在事件处理程序中注释 AbonnementChanges的原因(否则它将无限循环)。
我不知道问题从何而来,因为我重置了通知( OnChanges)并且我的请求符合要求( https://msdn.microsoft.com/en-us/library/ms181122.aspx)。
编辑:我想加上 { Notification = null }不返回任何内容。
编辑:看起来它来自数据库配置,而不是我的实现,因为我尝试了另一个实现,结果是相同的行为: http://www.codeproject.com/Articles/144344/Query-Notification-using-SqlDependency-and-SqlCach
编辑:我不知道它是从哪里来的,因为我使用的SA是系统管理员,有所有的权利,不是吗?
编辑:我试图在本教程之后定义到数据库的另一个连接: http://www.codeproject.com/Articles/12862/Minimum-Database-Permissions-Required-for-SqlDepen
所以我创建了两个角色:
EXEC sp_addrole 'sql_dependency_subscriber' 
EXEC sp_addrole 'sql_dependency_starter'

-- Permissions needed for [sql_dependency_starter]
GRANT CREATE PROCEDURE to [sql_dependency_starter]
GRANT CREATE QUEUE to [sql_dependency_starter]
GRANT CREATE SERVICE to [sql_dependency_starter]
GRANT REFERENCES on
CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]
to [sql_dependency_starter]
GRANT VIEW DEFINITION TO [sql_dependency_starter]

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

然后我将用户( select * from sys.dm_qn_subscriptions)添加到此角色:
--确保我的用户是正确角色的成员。
EXEC sp_addrolemember 'sql_dependency_starter', 'production'
EXEC sp_addrolemember 'sql_dependency_subscriber', 'production'

但在这种关系下,我的行为和以前一样。立即触发通知:
------------------------------ UPDATTEEEE -------------------------
Info: Query
Source: Statement
Type: Subscribe

编辑:我尝试了一些更简单的请求,比如: production
以下是应检查的表的详细信息:
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Utilisateur](
[IdUtilisateur] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [DF_Utilisateur_IdUtilisateur] DEFAULT (newid()),
[Code] [varchar](10) NOT NULL,
[Nom] [varchar](100) NOT NULL,
[Prenom] [varchar](100) NULL,
[NomComplet] AS (([Prenom]+' ')+[Nom]),
[Login] [varchar](50) NULL,
[Synchroniser] [bit] NOT NULL CONSTRAINT [DF_Utilisateur_Synchroniser] DEFAULT ((1)),
[DATE_CREATION] [datetime] NOT NULL CONSTRAINT [DF__Utilisate__DATE___2AA1E7C7] DEFAULT (getdate()),
[DATE_DERNIERE_MODIF] [datetime] NOT NULL CONSTRAINT [DF__Utilisate__DATE___2B960C00] DEFAULT (getdate()),
[Desactive] [bit] NOT NULL CONSTRAINT [DF_Utilisateur_Desactive] DEFAULT ((0)),
CONSTRAINT [PK_Utilisateur] PRIMARY KEY CLUSTERED
(
[IdUtilisateur] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

我们可以看到有些列不能被请求。所以我才不使用它。
现在让我们用 SELECT Nom, Prenom FROM dbo.Utilisateur检查一下:
select语句中的投影列必须显式
和表名必须用两部分名称限定。通知
这意味着语句中引用的所有表都必须是
在同一个数据库中。好啊
语句不能使用星号()或表名。语法到
指定列。好啊
语句不能使用未命名的列或重复的列名。好啊
语句必须引用基表。好啊
select语句中的投影列不能包含
聚合表达式,除非语句使用GROUP BY
表达。提供GROUP BY表达式时,选择列表
可能包含聚合函数count_big()或sum()。然而,
不能为可为空列指定sum()。好啊
语句不能指定having、cube或rollup。计划的
select语句中用作简单表达式的列
不得出现多次。好啊
语句不能包含pivot或unpivot运算符。好啊
语句不能包含intersect或except运算符。好啊
语句不能引用视图。好啊
语句不能包含以下任何内容:DISTINCT,
计算,计算由或进入。好啊
语句不能引用服务器全局变量
(@变量名)。好啊
语句不能引用派生表、临时表或
表格变量。好啊
语句不能引用其他数据库中的表或视图
或服务器。好啊
语句不能包含子查询、外部联接或
自我连接。好啊
语句不能引用大型对象类型:text、ntext,
还有形象。好啊
语句不能使用contains或freetext全文
谓词。好啊
语句不能使用行集函数,包括openrowset和
打开查询。好啊
语句不能使用以下任何聚合函数:
平均值、计数(*)、最大值、最小值、标准偏差、标准偏差、变量或变量。好啊
语句不能使用任何不确定函数,包括
排序和窗口功能。好啊
语句不能包含用户定义的聚合。好啊
语句不能引用系统表或视图,包括
目录视图和动态管理视图。好啊
语句不能包含浏览信息。好啊
语句不能引用队列。好啊
语句不能包含不能
更改并不能返回结果(例如,其中1=0)。好啊
但那仍然不起作用…=(
最终编辑-解决方案:正如jon tirjan所说,这是由我的计算列 SELECT Nom, Prenom FROM dbo.Utilisateur引起的,该列在服务代理中无效(即使我不要求通知此列的更改,这对我来说很奇怪)。

最佳答案

ServiceBroker无法处理具有计算列的表。您需要从表中删除NomComplet,或将其更改为另一种填充方式(触发器、存储过程等)的实际列。
正在立即触发通知,因为在设置队列时发生错误。

关于c# - SqlDependency立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com