正在从SqlDependency获取数据
本文关键字:获取 数据 SqlDependency | 更新日期: 2023-09-27 17:59:01
我有一个表和一个正在等待新插入的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 的
只需使用与.NET 3.5兼容的跨平台开源SqlDependencyEx。它使用数据库触发器和本机Service Broker通知来接收有关表更改的事件。这是一个用法示例:
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
您可以获得更改通知以及已更改的信息。请点击链接了解详细信息。
我希望这能帮助你:
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
这将为您提供刚刚删除的所有行(或使用旧值进行更改)。另一边:
select * from mytable left outer join ##temptable
ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2
WHERE ##temptable.field2 is null
将为您提供刚刚添加(或使用新值更改)的所有行。比较之后,您只需要用新值更新临时表(更快的方法是删除所有内容并插入所有值)当然,若您的程序将由不同的用户同时运行,那个么您需要在临时表中处理userid。