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 リファレンスは不完全です。完全なリストは、Creating a Query for Notificationの SQL リファレンスにあります。後者には、次のリストも含まれています。

ステートメントには、double/real データ型に基づく比較または式を含めてはなりません。

もう 1 つの問題は、クエリで発生する string から datetime へのキャストである可能性があります。これは、非決定論的と見なされる場合があります (これは、ADO.Net と SQL 仕様の両方に記載されている基準です)。代わりに型指定されたパラメーターを使用してみてください。DateTime 型WHERE ModifyDT > @lastDateTimeのパラメーターを渡します。

于 2010-03-03T19:09:22.803 に答える
2

あなたはどうやらすでに日付を生成する何かを持っています

LastExecutionDateTime

したがって、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 に答える