2013-01-15 56 views
3

我剛剛從微軟官方源代碼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()) 
        { 
        } 
       } 
      } 
     } 
    } 
} 

回答

2

SqlDependency通常工作如你預期它。它會在事件發生變化時觸發事件。如果查詢出現問題,則會發生常量調用。使用完整的兩部分表名(例如dbo.TableName)很重要。

MSDN文檔並不差 - 看看這個更新的article或這個one版本。

+0

我看了那篇文章,但是我在一個屏幕上打開了SQL Management Studio,而在另一個屏幕上打開了我的應用程序,它所做的所有事情都是循環播放,並不斷用上述查詢輪詢數據庫。我不知道這是否正確,對我來說這似乎是錯誤的? –

+0

你正在調試你的代碼,還是你看到SQL Profiler中的查詢?如果你在SQL Profiler中每隔一秒或更頻繁地看到查詢,那肯定是錯誤的。你可以添加相應的C#代碼嗎? – Andreas

+0

添加了我正在使用的代碼...在SQL事件探查器中我一遍又一遍地看到select語句,這讓我認爲它不起作用。 –

1

發現,上面的代碼是很好,當我: - 右擊數據庫選擇屬性 - 選擇選項 - 設置兼容級別到SQL Server 2008(100) - OK

爆炸代碼正常。