У меня возникли проблемы с интеграцией службы SqlDependency с моим приложением Windows Forms, и я надеялся, что кто-то может помочь новичку. Я просто хочу предвосхитить это, я знаю, что моя строка подключения к базе данных и мои операторы запросов верны. Кроме того, я знаю, что сервисный брокер включен в моей базе данных. Выпуск:
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 никогда не запускается. Я предполагаю, что делаю что-то дурацкое, но у меня нет понимания, чтобы понять это. Благодарю.