从 Sql 服务器获取通知
Getting notification from Sql Server
我想在我的 winforms 应用程序中使用 SqlDependency
class :
public partial class Form1 : Form
{
private int changeCount = 0;
private const string statusMessage = "{0} changes have occurred.";
private static SqlConnection connection = null;
private static SqlCommand command = null;
private static SqlDependency dependency;
private static SqlCommand command1 = null;
private static SqlDependency dependency1;
public Form1()
{
InitializeComponent();
button1.Enabled = CanRequestNotifications();
this.FormClosed += Form1_FormClosed;
if (connection == null)
{
connection = new SqlConnection(GetConnectionString());
}
if (command == null)
{
command = new SqlCommand("procCreationUser", connection);
command.CommandType = CommandType.StoredProcedure;
}
dependency = new SqlDependency(command);
if (connection == null)
{
connection = new SqlConnection(GetConnectionString());
}
if (command1 == null)
{
command1 = new SqlCommand("procSelectionUser", connection);
command1.CommandType = CommandType.StoredProcedure;
}
dependency1 = new SqlDependency(command1);
GetData();
}
private void GetData()
{
SqlDependency.Start(GetConnectionString());
if (connection.State != ConnectionState.Open) connection.Open();
using (var dr = command.ExecuteReader())
{
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
}
using (var dr = command1.ExecuteReader())
{
dependency1.OnChange += new OnChangeEventHandler(dependency_OnChange);
}
}
private string GetConnectionString()
{
return @"Data Source=PRT-12\SQLEXPRESS; Initial Catalog=TestNotification;Integrated Security=True";
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
MessageBox.Show("Notification");
}
}
我创建了两个存储过程:procCreationUser
用于创建,procSelectionUser
用于 select 用户。
当我启动应用程序并单击按钮并在数据库中插入新行时,我没有收到任何通知!!!!!
- 如何修复我的代码?
- 这是从 Sql 服务器获取通知的最佳方式吗?
通常您应该先订阅活动 dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
,然后您才会收到来自 command.ExecuteReader()
的更新。
对于两个单独的命令,最好有两个单独的 SqlDependency
.
我推荐你阅读这些:
- Using SQL Trace to Troubleshoot Query Notifications
- Troubleshooting Query Notifications: Checking a Subscription
- Troubleshooting Query Notifications: Subscription Registered, Event Message Not Produced, Subscription Removed
- Troubleshooting Dialogs
- The Mysterious Notification
您需要确定以下事件全部发生:
- 您的查询创建了一个通知订阅。检查上面文章中提到的Profiler事件,检查
sys.dm_qn_subscriptions
- 检查修改数据是否使订阅无效,使用上面文章中提到的 Profiler 事件
- 检查通知消息是否送达,特别检查
sys.transmission_queue
中的 transmission_status
- 检查您的代码是否已成功设置通知侦听器。您的应用 必须 在应用域关闭时调用
SqlDependency.Start
once per appdomain and ideally should call SqlDependency.Stop
。
收到通知后,请确保检查并遵守 SqlNotificationEventArgs
参数中的 Source
、Info
和 Type
。并非所有组合都表示成功,通知也可能会立即触发,表明您的订阅有问题。
此外,您的代码还有一些小花絮:
您需要在 执行查询之前连接 SqlDependency :
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
使用 (var dr = command.ExecuteReader()) {
而 (dr.Read()) {
...
}
}
您需要为每个应用程序域SqlDependency.Start
调用一次。在显示 Form
之前尝试在 Main 中调用它
我想在我的 winforms 应用程序中使用 SqlDependency
class :
public partial class Form1 : Form
{
private int changeCount = 0;
private const string statusMessage = "{0} changes have occurred.";
private static SqlConnection connection = null;
private static SqlCommand command = null;
private static SqlDependency dependency;
private static SqlCommand command1 = null;
private static SqlDependency dependency1;
public Form1()
{
InitializeComponent();
button1.Enabled = CanRequestNotifications();
this.FormClosed += Form1_FormClosed;
if (connection == null)
{
connection = new SqlConnection(GetConnectionString());
}
if (command == null)
{
command = new SqlCommand("procCreationUser", connection);
command.CommandType = CommandType.StoredProcedure;
}
dependency = new SqlDependency(command);
if (connection == null)
{
connection = new SqlConnection(GetConnectionString());
}
if (command1 == null)
{
command1 = new SqlCommand("procSelectionUser", connection);
command1.CommandType = CommandType.StoredProcedure;
}
dependency1 = new SqlDependency(command1);
GetData();
}
private void GetData()
{
SqlDependency.Start(GetConnectionString());
if (connection.State != ConnectionState.Open) connection.Open();
using (var dr = command.ExecuteReader())
{
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
}
using (var dr = command1.ExecuteReader())
{
dependency1.OnChange += new OnChangeEventHandler(dependency_OnChange);
}
}
private string GetConnectionString()
{
return @"Data Source=PRT-12\SQLEXPRESS; Initial Catalog=TestNotification;Integrated Security=True";
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
MessageBox.Show("Notification");
}
}
我创建了两个存储过程:procCreationUser
用于创建,procSelectionUser
用于 select 用户。
当我启动应用程序并单击按钮并在数据库中插入新行时,我没有收到任何通知!!!!!
- 如何修复我的代码?
- 这是从 Sql 服务器获取通知的最佳方式吗?
通常您应该先订阅活动 dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
,然后您才会收到来自 command.ExecuteReader()
的更新。
对于两个单独的命令,最好有两个单独的 SqlDependency
.
我推荐你阅读这些:
- Using SQL Trace to Troubleshoot Query Notifications
- Troubleshooting Query Notifications: Checking a Subscription
- Troubleshooting Query Notifications: Subscription Registered, Event Message Not Produced, Subscription Removed
- Troubleshooting Dialogs
- The Mysterious Notification
您需要确定以下事件全部发生:
- 您的查询创建了一个通知订阅。检查上面文章中提到的Profiler事件,检查
sys.dm_qn_subscriptions
- 检查修改数据是否使订阅无效,使用上面文章中提到的 Profiler 事件
- 检查通知消息是否送达,特别检查
sys.transmission_queue
中的 - 检查您的代码是否已成功设置通知侦听器。您的应用 必须 在应用域关闭时调用
SqlDependency.Start
once per appdomain and ideally should callSqlDependency.Stop
。
transmission_status
收到通知后,请确保检查并遵守 SqlNotificationEventArgs
参数中的 Source
、Info
和 Type
。并非所有组合都表示成功,通知也可能会立即触发,表明您的订阅有问题。
此外,您的代码还有一些小花絮:
您需要在 执行查询之前连接 SqlDependency :
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 使用 (var dr = command.ExecuteReader()) { 而 (dr.Read()) { ... } }
您需要为每个应用程序域
SqlDependency.Start
调用一次。在显示 Form 之前尝试在 Main 中调用它