从SqlDependency获取数据

我有一个表和一个等待新插入的SqlDependency。

OnChange会根据需要触发,但我不明白是否有可能获得导致数据库更改的行。

SqlDependency sql命令:

SqlCommand cmd = new SqlCommand("SELECT id FROM dbo.DataRequests", m_sqlConn); 

OnChange代码:

 private void OnChange(object sender, SqlNotificationEventArgs e) { SqlDependency dependency = sender as SqlDependency; dependency.OnChange -= OnChange; Console.WriteLine("Info: " + e.Info.ToString()); Console.WriteLine("Source: " + e.Source.ToString()); Console.WriteLine("Type: " + e.Type.ToString()); Console.WriteLine(DateTime.Now); GetMessages(); } 

没有关于导致依赖性被触发的行的信息。

我想作为一种解决方法,您可以随时在记录上添加时间戳,并跟踪事件上次触发的时间。

看一下这个组件: SqlTableDependency

对于在SQL Server数据库表上执行的每个更改,C#代码都会收到一个事件,其中包含已更改的RECORD列表。

根据这篇文章,你不能: http : //social.msdn.microsoft.com/Forums/en-US/sqlservicebroker/thread/07234067-73e1-4db5-a4e6-0f9f0bae22ae/

您只能使用属性缩小通知原因

  • 资源
  • 类型
  • 信息

提供的SqlNotificationEventArgs

在这里找到一个非常巧妙的解决方案

我希望这可以帮助你:

  string commandString = string.Format("SELECT [Id] FROM [dbo].[Tech]"); command = new SqlCommand(commandString, connection); private void dependency_OnChange(object sender, SqlNotificationEventArgs e) { SqlDependency dependency = (SqlDependency)sender; dependency.OnChange -= dependency_OnChange; this.Dispatcher.Invoke((System.Action)(() => { if (e.Info.ToString().ToLower().Trim() == "insert") { GetData(); int NewTechID = TechIDs.Last(); } })); } private void GetData() { command.Notification = null; SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); command.Connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { TechIDs.add(int.Parse(reader.GetValue(0).ToString())); } reader.Close(); } command.Connection.Close(); } 

您可以使用Temp表。 首先,您需要创建一个临时表,其中包含您需要继续调查的所有字段。 就像是:

 CREATE TABLE ##TempTab( [field1] [varchar](50) NULL, [field2] [varchar](50) NULL } 

请注意,在外部cose中创建的表格会自动删除,因为创建者程序退出所以你不需要将它放在formClosing上……现在,在设置sqlDepency之后你需要填写临时表,这是一些东西就像起始场景的快照一样。 然后,每次触发onChange事件时,您只需要将临时表与更新的情况进行比较。 它可能是这样的:

  select * from ##temptable left outer join mytable ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2 WHERE myTable.field2 is null 

这将为您提供刚刚删除的所有行(或使用旧值进行chagend)。 另一方面:

 select * from mytable left outer join ##temptable ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2 WHERE ##temptable.field2 is null 

将为您提供刚刚添加的所有行(或使用新值更改)。 在比较之后,您只需要使用新值更新临时表(更快的方法是删除所有内容并插入所有值)当然,如果您的程序将由不同的用户同时运行,您将需要在临时表中处理用户ID 。