2015-08-15 81 views
3

我遇到在SqlDependency中使用此SQL語句的問題。它不會激活SqlDependency.OnChange事件,但是會在SQL Server查詢窗口上按預期方式返回結果。SqlDependency.OnChange沒有在datetime列上使用過濾器觸發

SELECT [Order].OrderId 
FROM [dbo].[Order] 
WHERE [Order].CreatedOn > '20150815 21:11:57.502' 

我這裏https://technet.microsoft.com/en-us/library/ms181122(v=sql.105).aspx閱讀支持的SELECT語句部分,但沒有發現違反任何規則。

任何想法?

更新:

我下面全碼:

private void CheckForNewOrders(DateTime dt) 
    { 
     string json = null; 
     string conStr = ConfigurationManager.ConnectionStrings["connstring"].ConnectionString; 

     using (SqlConnection connection = new SqlConnection(conStr)) 
     { 
      string query = string.Format(@" 
        SELECT [Order].OrderId 
        FROM [dbo].[Order] 
        WHERE [Order].CreatedOn > '{0}'" 
, dt.ToString("yyyyMMdd HH:mm:ss.fff")); // 20150814 00:00:00.000 

      using (SqlCommand command = new SqlCommand(query, connection)) 
      { 
       command.Notification = null; 
       SqlDependency dependency = new SqlDependency(command); 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
       connection.Open(); 
       SqlDataReader reader = command.ExecuteReader(); 

       if (reader.HasRows) 
       { 
        reader.Read(); 
        json = "testing ... "; reader[0].ToString(); 
       } 
      } 
     } 
    } 

    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     if (e.Type == SqlNotificationType.Change) 
     { 
      CheckForNewOrders(DateTime.Now); 
     } 
    } 

更新(在jmelosegui的答案的響應):

  query = string.Format(@" 
        SELECT [Order].OrderId 
        FROM [dbo].[Order] 
        WHERE [Order].CreatedOn > @CreatedOn"); 

...

  using (SqlCommand command = new SqlCommand(query, connection)) 
      { 
       command.Parameters.Add("@CreatedOn", SqlDbType.DateTime); 
       command.Parameters["@CreatedOn"].Value = DateTime.Now; 

       command.Notification = null; 
       SqlDependency dependency = new SqlDependency(command); 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
       connection.Open(); 
       SqlDataReader reader = command.ExecuteReader(); 

       if (reader.HasRows) 
       { 
       ... 
       } 
      } 
+0

謝謝你明確地添加你的修復程序。這正是我的問題,您的解決方案的工作原理。 – ManInMoon

回答

3

我認爲你應該得到通知事件不是那種類型。

您可以加入一個else分支您dependency_OnChange方法,看看你得到任何其他SqlNotificationType,如:

你能嘗試添加類型化的參數

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    if (e.Type == SqlNotificationType.Change) 
    { 
     CheckForNewOrders(DateTime.Now); 
    } 
    else 
    { 
     //Do somthing here 
     Console.WriteLine(e.Type); 
    } 
} 

更新:

WHERE [Order].CreatedOn > @myDateTime 

並傳遞DateTime類型的參數而不是使用字符串轉換。

+0

我剛剛試過你的建議,發現OnChange事件根本沒有發射。但是,只要我刪除了where條件,就可以按預期工作。 –

+0

我想你是指命令參數? –

+0

請查看原始帖子底部的代碼更新。當我在表中插入一條新記錄時(它使用GETDATE()作爲默認表列值進行更新時,它開始觸發OnChange事件)'BUT' reader.HasRows總是返回false,即使'SqlNotificationEventArgs.Type是Change '。 –

0

首先,檢查所有sql依賴項服務的限制。當sql表更改將觸發時,where子句在sql依賴項事件中不起作用。你的查詢應該被修改。

query = string.Format(@" 
       SELECT [Order].OrderId 
       FROM [dbo].[Order] 
       ORDER BY [dbo].[Order].DateTime desc 
     ); 

請應用這些更改並調試項目。