gpt4 book ai didi

winforms - 订阅 SQL 表更改的通用实用程序

转载 作者:行者123 更新时间:2023-12-02 04:07:54 26 4
gpt4 key购买 nike

在互联网上搜索了一段时间后,我发现这段代码会在基于 LINQ 的数据库更改时触发。它只触发一次,并且没有提及或显示更改/删除/添加的内容,或 CRUDed 的表。

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 的变化呢?它不会触发直接更改等。

引用:
Extemporaneous Mumblings

最佳答案

SQLDependency 只会触发一次,您需要在它触发后重新创建依赖项。

The OnChange event fires once and then gets consumed, so you need to hook up the event again after it fires.



Dan Miser - SqlDependency

我手头没有任何 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 了解发生了什么。 ,这将使您知道发生了什么(在我的示例中,我只是在寻找删除和更新)。

关于winforms - 订阅 SQL 表更改的通用实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677869/

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