10

新しい挿入を待っているテーブルと SqlDependency があります。

OnChange は必要に応じて起動しますが、データベースの変更を引き起こす行を取得できるかどうかわかりません。

SqlDependency SQL コマンド:

SqlCommand cmd = new SqlCommand("SELECT id FROM dbo.DataRequests", m_sqlConn);

OnChange コード:

private void OnChange(object sender, SqlNotificationEventArgs e)
{
    SqlDependency dependency = sender as SqlDependency;

    dependency.OnChange -= OnChange;

    Console.WriteLine("Info:   " + e.Info.ToString());
    Console.WriteLine("Source: " + e.Source.ToString());
    Console.WriteLine("Type:   " + e.Type.ToString());


    Console.WriteLine(DateTime.Now);

    GetMessages();

}
4

7 に答える 7

-1

一時テーブルを使用できます。まず、調査を続ける必要があるすべてのフィールドを含む一時テーブルを作成する必要があります。何かのようなもの:

CREATE TABLE ##TempTab(
    [field1] [varchar](50) NULL,
    [field2] [varchar](50) NULL
}

クリエーター プログラムが終了するため、外部 cose 内で作成された種類のテーブルは自動的に削除されるので、formClosing にドロップする必要はありません。開始シナリオのスナップショットのように。次に、 onChange イベントが発生するたびに、一時テーブルを更新された状況と比較するだけです。それは次のようなものかもしれません:

    select * from ##temptable left outer join mytable
ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2
WHERE myTable.field2 is null

これにより、すべての行が削除されたばかりです(または古い値で変更されます)。反対側:

select * from mytable left outer join ##temptable
    ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2
    WHERE ##temptable.field2 is null

追加された(または新しい値で変更された)すべての行が表示されます。この比較の後、一時テーブルを新しい値で更新する必要があります(より高速な方法は、すべてを削除してすべての値を挿入することです)もちろん、プログラムが異なるユーザーによって同時に実行される場合は、一時テーブル内でユーザーIDを処理する必要があります.

于 2013-10-01T10:25:44.540 に答える
-1

これがお役に立てば幸いです:

     string commandString = string.Format("SELECT [Id] FROM [dbo].[Tech]");
     command = new SqlCommand(commandString, connection);

    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        SqlDependency dependency = (SqlDependency)sender;
        dependency.OnChange -= dependency_OnChange;

        this.Dispatcher.Invoke((System.Action)(() =>
        {

            if (e.Info.ToString().ToLower().Trim() == "insert")
            {
                GetData();
                int NewTechID = TechIDs.Last();
            }

        }));
    }

    private void GetData()
    {
        command.Notification = null;
        SqlDependency dependency = new SqlDependency(command);
        dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

        command.Connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                TechIDs.add(int.Parse(reader.GetValue(0).ToString()));
            }
            reader.Close();
        }
        command.Connection.Close();
    }
于 2013-02-18T07:36:40.693 に答える