我刚刚从官方Microsoft来源http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx复制了该示例,但我对此感到困惑。运行该应用程序后,即使没有使用该表,它也会使数据库持续命中?我以为该表实际更改时会触发事件?我不希望它每秒进行恒定的数据库调用,这太糟糕了。
我做错了什么吗?我想我还不确定。任何人都具有一个好的示例的链接,最好没有MSDN的链接。
感谢,奥南。
这是SQL:
return "SELECT [ID],[FromMachine],[FromStore],[FromUser] FROM dbo.Store_Message";
根据要求,所有代码:
public partial class Form1 : Form
{
string connectionString = "server=localhost;database=usicoal;uid=admin;password=";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
GetNames();
}
private bool DoesUserHavePermission()
{
try
{
SqlClientPermission clientPermission = new SqlClientPermission(PermissionState.Unrestricted);
clientPermission.Demand();
return true;
}
catch
{
return false;
}
}
void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(GetNames));
}
else
{
GetNames();
}
SqlDependency dep = sender as SqlDependency;
dep.OnChange -= new OnChangeEventHandler(dep_OnChange);
}
private void GetNames()
{
if (!DoesUserHavePermission())
return;
SqlDependency.Stop(connectionString);
SqlDependency.Start(connectionString);
using (SqlConnection cn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ID FROM dbo.[BTE_SIMPLE_STORE_MESSAGE]";
cmd.Notification = null;
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(dep_OnChange);
cn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
}
}
}
}
}
}
SqlDependency通常可以按预期工作。如果您的数据库中发生了某些更改,它将触发事件。如果您的查询出了问题,就会不断调用。使用完整的两部分表名(例如dbo.TableName)非常重要。
发现上面的代码在我时很好:
使该代码正常运行。