我剛剛從微軟官方源代碼http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx中複製了這個示例,我對此感到莫名其妙。運行該應用程序後,即使沒有任何內容使用該表,它也會使數據庫命中常量?我認爲當桌子真的發生變化時,事件會發生?我不希望它每秒都會進行持續的數據庫調用,那太糟糕了。SqlDependency常量數據庫匹配
我做錯了什麼?我想我不確定是什麼。任何人都可以鏈接到一個很好的例子,最好不是MSDN。
在此先感謝,Onam。
這是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())
{
}
}
}
}
}
}
我看了那篇文章,但是我在一個屏幕上打開了SQL Management Studio,而在另一個屏幕上打開了我的應用程序,它所做的所有事情都是循環播放,並不斷用上述查詢輪詢數據庫。我不知道這是否正確,對我來說這似乎是錯誤的? –
你正在調試你的代碼,還是你看到SQL Profiler中的查詢?如果你在SQL Profiler中每隔一秒或更頻繁地看到查詢,那肯定是錯誤的。你可以添加相應的C#代碼嗎? – Andreas
添加了我正在使用的代碼...在SQL事件探查器中我一遍又一遍地看到select語句,這讓我認爲它不起作用。 –