Winforms 用于订阅SQL表更改的通用实用程序
在互联网上搜索了一段时间后,我发现了这段代码,它会在基于LINQ的数据库更改时触发。它只触发一次,不提及或显示更改/删除/添加的内容,也不显示哪些表被损坏Winforms 用于订阅SQL表更改的通用实用程序,winforms,sql-server-2008,linq-to-sql,c#-3.0,sqldependency,Winforms,Sql Server 2008,Linq To Sql,C# 3.0,Sqldependency,在互联网上搜索了一段时间后,我发现了这段代码,它会在基于LINQ的数据库更改时触发。它只触发一次,不提及或显示更改/删除/添加的内容,也不显示哪些表被损坏 static class GlobalNotifications { public static event OnChangeEventHandler OnChange; public static void InitializeNotifications(string connectString) {
static class GlobalNotifications
{
public static event OnChangeEventHandler OnChange;
public static void InitializeNotifications(string connectString)
{
// Initialize notifications
SqlDependency.Start(connectString);
// Create and register a new dependency
SqlDependency dependency = new SqlDependency();
dependency.OnChange += new OnChangeEventHandler(NotificationCallback);
System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id);
}
internal static void NotificationCallback(object o, SqlNotificationEventArgs args)
{
OnChange.Invoke(o, args);
}
}
我就是这样使用它的:
public partial class Nawa : Form
{
public Nawa()
{
InitializeComponent();
}
private void Nawa_Load(object sender, EventArgs e)
{
GlobalNotifications.InitializeNotifications("Server=GENISYSSERVER; Trusted_Connection=no;database=Maple_DBv1; user id=sa; password=Wc123Wc123");
GlobalNotifications.OnChange += new System.Data.SqlClient.OnChangeEventHandler(GlobalNotifications_OnChange);
}
void GlobalNotifications_OnChange(object sender, System.Data.SqlClient.SqlNotificationEventArgs e)
{
MessageBox.Show("Test");
}
private void button1_Click(object sender, EventArgs e)
{
using (DataClasses1DataContext dbcontext = new DataClasses1DataContext("Server=GENISYSSERVER; Trusted_Connection=no;database=Maple_DBv1; user id=sa; password=Wc123Wc123")) {
OrderFood random = dbcontext.OrderFoods.FirstOrDefault(id => id.ID == 10);
if (random != null) {
if (random.MenuID == 4)
random.MenuID = 1;
else
random.MenuID = 4;
dbcontext.SubmitChanges();
}
}
}
}
在这方面有人能帮忙吗?如何获得更改内容、更改类型、表更改以及为什么只触发一次的更多详细信息。此外,它如何仅理解LINQ更改?它不会触发直接的变化等
参考:
SQLDependency只触发一次,您需要在触发后重新创建依赖项 OnChange事件触发一次,然后被消费,因此您需要在事件触发后再次连接该事件 我手头没有任何C#代码来演示如何处理这个问题,但我相信一些VB.NET应该能够很好地工作,让您能够想出自己的解决方案
Private _permissionsDependency As SqlDependency
Private Sub doSubscribe()
_permissionsDependency = New SqlDependency(cmd.InnerCommand)
RemoveHandler _permissionsDependency.OnChange, AddressOf User_OnChange
AddHandler _permissionsDependency.OnChange, AddressOf User_OnChange
End Sub
Private Sub User_OnChange(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlNotificationEventArgs)
If _permissionsDependency IsNot Nothing Then RemoveHandler _permissionsDependency .OnChange, AddressOf User_OnChange
Select Case e.Info
Case SqlNotificationInfo.Delete
RaiseEvent UserDeleted(Me)
Case SqlNotificationInfo.Update
populateUser()
RaiseEvent UserUpdated(Me)
Case Else
End Select
End Sub
如您所见,您可以通过查看e.Info
,了解发生了什么事情(在我的示例中,我只查找删除和更新)