2015-08-15 80 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 
     ); 

请应用这些更改并调试项目。