0

SqlDependencyサービスをWindowsフォームアプリと統合する際に問題が発生しました。誰かが新人を助けてくれることを期待していました。これを前置きしたいのですが、データベース接続文字列とクエリステートメントが正しいことを知っています。さらに、データベースでサービスブローカーが有効になっていることを知っています。発行:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'Database'

クエリから1を返します。

次のように、メインフォームの読み込みイベントで依存関係を開始します。

SqlDependency::Stop(Get_DB_String());
SqlDependency::Start(Get_DB_String());

次に、次のようにデータベースからプルします。

    bindingSource->DataSource = GetData("Select * From Table", 
                                              Get_DB_String(), 
                                                 dataAdapter);
    dataGridView->DataSource = bindingSource;

GetDataは次のように定義されます。

DataTable^ GetData( String^ sqlCommand, String^ connectionString, SqlDataAdapter^ adapter )
   {
      SqlConnection^ Connection = gcnew SqlConnection(connectionString);
      SqlCommand^ command = gcnew SqlCommand(sqlCommand,Connection);
      command->Notification = nullptr;              
      SqlDependency^ dependency = gcnew SqlDependency(command);     
      dependency->OnChange += gcnew OnChangeEventHandler(this, &LabSchedule::Form1::OnChange);
      adapter->SelectCommand = command;
      DataTable^ table = gcnew DataTable;
      adapter->Fill(table);  
      return table;
   }

そして、私の変更ハンドラーは次のように定義されています。

System::Void OnChange(System::Object^ sender, SqlNotificationEventArgs^ e)
{

    ISynchronizeInvoke^ i = (ISynchronizeInvoke^)this;

    if (i->InvokeRequired)
    {

        OnChangeEventHandler^ tempDelegate =
            gcnew OnChangeEventHandler(this, &LabSchedule::Form1::OnChange);

        array<System::Object^>^ args = { sender, e };

        i->BeginInvoke(tempDelegate, args);

        return;
    }

    SqlDependency^ dependency = (SqlDependency^)sender;
    dependency->OnChange -= gcnew OnChangeEventHandler(this, &LabSchedule::Form1::OnChange);

    if(dependency->HasChanges)
    {
        // This is where I check the properties of the notification  
        MessageBox::Show(e->Info.ToString() + "\n" + e->Source.ToString() + "\n" + e->Type.ToString());
    }

}

データベース内の何かをローカルクライアントから変更すると、変更イベントが発生し、すべてが正常に表示されます。ただし、別のマシンのクライアントから変更を開始すると、OnChangeイベントが発生することはありません。私は何か風変わりなことをしていると思いますが、それを理解するための洞察がありません。ありがとう。

4

1 に答える 1

0

一見無限の研究の結果、私が抱えていた問題は、コードではなく、テーブルの設計に根ざしていました。問題を解決するために私がおそらく変更した3つのことは次のとおりです。

ステートメントは、大きなオブジェクトタイプ(text、ntext、およびimage)を参照してはなりません。

いずれかの列のデータ型として「ntext」を使用していました。

ステートメントは、列を指定するためにアスタリスク( *)またはtable_name。*構文を使用することはできません。

最初は、ワイルドカードを使用してテーブルからデータを選択していました。

SELECTステートメントの射影列は明示的に指定する必要があり、表名は2部構成の名前で修飾する必要があります。

SELECTステートメントで2つの部分からなるテーブル名、つまり「dbo.Table_name」ではなく「Table_name」を使用していませんでした。

これは釘付けにするのが難しいものでした、そしてこれが同様の問題を抱えている他の誰かに役立つことを願っています。私のクエリは完全に合法ですが、SqlNotificationsに対して無効だったため、問題の最初の説明を間違えました。

于 2012-02-13T14:48:09.713 に答える