c# - SqlDependency.OnChange 未在日期时间列上使用过滤器触发

标签 c# sql-server tsql sqldependency query-notifications

我在 SqlDependency 中使用此 SQL 语句时遇到问题。它只是不激活 SqlDependency.OnChange 事件,而是按预期在 SQL Server 查询窗口中返回结果。

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

我在这里阅读了支持的 SELECT 语句部分 https://technet.microsoft.com/en-us/library/ms181122(v=sql.105).aspx但没有发现任何违规行为。

有什么想法吗?

更新:

我的完整代码如下:

    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)
                {
                ...
                }
            }

最佳答案

我认为您应该收到不是那种类型的通知事件。

您能否在您的dependency_OnChange 方法中添加一个else 分支以查看您是否正在获取任何其他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 类型的参数,而不是使用字符串转换。

关于c# - SqlDependency.OnChange 未在日期时间列上使用过滤器触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32026777/

相关文章:

sql-server - T-SQL : Using { fn NOW() } in WHERE

sql-server - 分解 SQL 脚本

sql - 有没有更好的方法来编写基于子查询删除记录的查询?

sql - FOR XML 无法序列化节点的数据,因为它包含一个字符 (0x000E)

sql - 使用 t-sql 仅加入 "latest"记录

c# - 在 Projection.Conditionals 中添加多个条件以进行查询

c# - 在 C# 中创建不透明指针(引用)

c# - 如何使页面不使用 ASP.NET MVC 3 中的母版页

c# - 使用 var 设置组件属性

c# - Double.Parse 精度/舍入问题