3

我使用以下查询设置了 SqlDependency:

string sql = "SELECT dbo.Case.CMRID, dbo.Case.SolutionID, dbo.Case.CreateDT, dbo.Case.ModifyDT "
+ "FROM dbo.Case "
+ "WHERE dbo.Case.ModifyDT > @LastExecutionDateTime";

执行此查询会导致 OnChanged 事件以Invalid和 Source of Statement类型连续触发。经过进一步研究,我发现当您的查询违反与索引视图规则相同的规则时会发生什么,因为这是该通知机制所基于的。

使用查询通知 (ADO.NET)检查特殊注意事项我没有看到我违反此语句的任何规则。

修改语句为

string sql = "SELECT dbo.Case.CMRID, dbo.Case.SolutionID, dbo.Case.CreateDT, dbo.Case.ModifyDT "
+ "FROM dbo.Case";

工作正常。OnChanged 事件仅在适当时触发,并且具有正确的类型集。

那么,如何仅返回自上次执行语句以来具有修改日期的记录?

4

3 回答 3

5

ModifyDT 是什么类型的?

QN 的 ADO.Net 参考资料不完整,完整列表位于创建通知查询的 SQL 参考资料中。后者还列出了以下内容:

该语句不得具有基于双精度/实数数据类型的比较或表达式。

另一个问题可能是查询中发生的从字符串到日期时间的转换,这可能被认为是不确定的(这是 ADO.Net 和 SQL 规范列出的标准)。尝试改用类型化参数:WHERE ModifyDT > @lastDateTime并传入 DateTime 类型的参数。

于 2010-03-03T19:09:22.803 回答
2

你显然有一些东西可以生成日期

上次执行日期时间

因此,与其在 SQL 上创建 SqlDependency,不如使用 SqlCommand 对象

string sql = "SELECT CMRID, SolutionID, CreateDT, ModifyDT " + "FROM dbo.Case " + "WHERE ModifyDT > @lastExecutionDateTime"; 
//notice the parameter @lastExecutionDateTime, you cant use dates as a string, you also cant use something like CONVERT(datetime, '20040508'). You need a real date time object, hence the parameter

//You also only need to use the two part table ref (dbo.x) in the FROM clause, you dont need it on every field
//and while you didnt do it here, if anyone is interested a two part table ref in the form of dbo.[Case] would fail because the brackets will kill your dependency subscription

SqlCommand dependencyCommand= new SqlCommand(sql);
dependencyCommand.Parameters.Add(new SqlParameter("lastExecutionDateTime", SqlDbType.DateTime) {
        Value = LastExecutionDateTime 
    });

然后只需创建对命令的依赖项

//Create a dependency object and associate it with the SqlCommand.
SqlDependency dependency = new SqlDependency();
dependency.AddCommandDependency(dependencyCommand);
//Subscribe to the SqlDependency event.
dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);

现在获取当前数据集并将其保存在内存中,以便您可以在依赖项触发时使用它进行比较

//get the most recent data
DataTable currentDependencyData = new DataTable();
SqlDataAdapter dataAdapter = new SqlDataAdapter(dependencyCommand);
dataAdapter.Fill(currentDependencyData);
于 2011-08-05T19:41:11.943 回答
0

如果您还没有弄清楚这一点,3 部分表名就是问题所在,请像这样尝试。

"SELECT [CMRID], 
       [SolutionID], 
       [CreateDT], 
       [ModifyDT] 
FROM [dbo].[Case] 
WHERE [ModifyDT] > " + LastExecutionDateTime;
于 2014-06-16T20:28:53.250 回答