c# - SqlDependency.OnChange 触发但 SqlDataReader 未返回数据

标签 c# asp.net signalr sqldependency query-notifications

当我使用日期时间列过滤器执行查询时

WHERE [Order].CreatedOn >= @CreatedOn

使用 SqlDependency , 数据源的变化触发了 SqlDependency.OnChange事件但SqlDataReaderSqlCommand 相关联不返回数据( reader.HasRows 总是返回 false )。

当我只是把我的SQL语句中的过滤条件改成

WHERE [Order].StatusId = 1"

它工作正常并且 SqlDataReader返回数据( reader.HasRows 返回 true )

代码:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SignalRServer
{
    public partial class DepartmentScreen : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var u = System.Security.Principal.WindowsIdentity.GetCurrent().User;
            var UserName = u.Translate(Type.GetType("System.Security.Principal.NTAccount")).Value;

            CheckForNewOrders(DateTime.Now);
        }

        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 >= @CreatedOn");

                //                query = string.Format(@"
                //                        SELECT [Order].OrderId
                //                        FROM [dbo].[Order]
                //                        WHERE [Order].StatusId = 1");

                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)
                    {
                        reader.Read();
                        json = reader[0].ToString();
                    }
                }
            }

            SignalRHub hub = new SignalRHub();
            hub.OrderReceived(json, null);
        }

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

图片:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

最佳答案

当方法 CheckForNewOrdersonchange 事件调用时

command.Parameters.Add("@CreatedOn", SqlDbType.DateTime);
command.Parameters["@CreatedOn"].Value = DateTime.Now;

对于参数 @CreatedOn,您传递的是 DateTime.Now(不是它的更改时间)。数据库中不会有满足条件的数据。

关于c# - SqlDependency.OnChange 触发但 SqlDataReader 未返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32039112/

相关文章:

c# - MVVM模式一定需要数据库吗?

c# - 带有 asp.net 的 sql server 的动态下拉功能

jquery - SignalR 的 $.hubConnection() 不工作

c# - 是否可以将 "inject"更新为 Knockout ViewModel?

c# - 在我的 React 应用程序上实现 SignalR

c# - Facebook 的大表实现

c# - 将泛型与 LINQ 继承结合使用

c# - 以编程方式配置 log4net 以写入单独的日志文件

c# - ASP.NET IIS 托管项目中的 Owin Startup.cs

c# - 将参数分配给sql数据源