当我使用日期时间列过滤器
执行查询时WHERE [Order].CreatedOn >= @CreatedOn
使用SqlDependency
,数据源的更改会触发SqlDependency.OnChange
事件,但与SqlDataReader
相关联的SqlCommand
不会返回数据{{1总是返回reader.HasRows
)。
当我只是将我的SQL语句中的过滤条件更改为
时false
它工作正常,WHERE [Order].StatusId = 1"
返回数据(SqlDataReader
返回reader.HasRows
)
代码:
true
图片:
答案 0 :(得分:4)
从CheckForNewOrders
事件
onchange
时
command.Parameters.Add("@CreatedOn", SqlDbType.DateTime);
command.Parameters["@CreatedOn"].Value = DateTime.Now;
对于参数@CreatedOn
,您要传递DateTime.Now
(不是更改时间)。在数据库中不会有任何满足条件的数据。
答案 1 :(得分:2)
当传递DateTime.Now作为参考日期时,您不太可能检索在某个时间点创建的记录(除非将来创建记录,因此您的服务器时间有问题或者列名" createdOn"非常具有误导性。)
要根据更新日期获取最新记录,您需要执行以下操作:
_refDate
在我的示例中,初始化为该值
在我的情况下,你选择DateTime.MinValue来获取第一个调用中的所有记录,然后只能逐步获取它们,你也可以在一个时刻开始使用DateTime.Now)dependency_OnChange
事件被触发时,您需要使用_refDate
的最后一个值触发查询,以便获取尚未检索到的所有内容_refDate
的值,依此类推.. 未经测试,但这应该有效(照顾_refDate全局可用)
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(_refDate);
}
private DateTime _refDate = DateTime.MinValue;
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, [Order].CreatedOn
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 = dt;
command.Notification = null;
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
//json = reader[0].ToString();
var date = Convert.ToDateTime(reader["CreatedOn"]);
if (date > _refDate)
{
_refDate = date;
}
}
}
}
}
//SignalRHub hub = new SignalRHub();
//hub.OrderReceived(json, null);
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
CheckForNewOrders(_refDate);
}
else
{
//Do somthing here
//Console.WriteLine(e.Type);
}
}
}
}