我正在尝试制作一个C#Forms程序来查看数据库中的数据。它需要在启动时请求数据,将其缓存,然后在更新数据库时对其进行更新。我正在尝试使用SqlDependency做到这一点。这是代码:
private const string connectionString = "Data Source=DESKTOP-VT1F04F\\MSSQLSERVER14;Initial Catalog=test1;Trusted_Connection=True";
private void button1_Click(object sender, EventArgs e)
{
SqlDependency.Stop(connectionString);
SqlDependency.Start(connectionString);
ExecuteWatchingQuery();
}
private void ExecuteWatchingQuery()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand("select nbase, name from dbo.filial", connection);
var sqlDependency = new SqlDependency(command);
sqlDependency.OnChange += new OnChangeEventHandler(OnDatabaseChange);
command.ExecuteReader();
}
}
private void OnDatabaseChange(object sender, SqlNotificationEventArgs args)
{
//MessageBox.Show("?");
SqlNotificationInfo info = args.Info;
if (SqlNotificationInfo.Insert.Equals(info)
|| SqlNotificationInfo.Update.Equals(info)
|| SqlNotificationInfo.Delete.Equals(info))
{
MessageBox.Show("!");
//todo
}
ExecuteWatchingQuery();
}
它什么也没做。 ExecuteWatchingQuery
竞争激烈,但OnDatabaseChange
从未解雇。但是,如果我用新创建的表将新的数据库watcher_test替换为新创建的数据库watcher_test,它将按预期工作。我尝试了以下SQL命令:
alter database test1 set enable_broker
CREATE QUEUE ContactChangeMessages;
CREATE SERVICE ContactChangeNotifications ON QUEUE ContactChangeMessages
两个数据库都具有相同的所有者(如select name, suser_sname(owner_sid) from sys.databases
所示),具有相同的权限,它们都位于同一台服务器上,在设置方面或其他地方,它们之间看不到任何区别。该程序无法访问第一个数据库中的任何表,但是能够从第一个表访问第二个表中使用insert into
完成的表的副本。该程序在使用从备份还原的相同数据库的另一台计算机上的行为相同。