Я попытался настроить SQL-зависимость для запуска запроса «Count Rows» (написанного на C#, SQL Server 2008 Express), но после того, как идет исходная подписка SQLNotificationType, обработчик событий никогда не кажется хотите снова запустить (несмотря на добавление строк, и я проверил SQL, и он возвращает ожидаемое значение ...).SQL Dependency not Firing
Мой код ниже. Любые мысли очень ценятся!
EDIT: Проект, в котором находится этот код, представляет собой программу WPF. У меня есть этот код, который хранится в отдельном классе, который моя программа WPF создает экземпляр в обработчике событий «Initialized». Затем у меня есть метод в этом классе, который сначала вызывает ConnectToDatabase(), а затем вызывает SetupSQLDependency().
EDIT 2: Как примечание, эта программа представляет собой WPF, который я надеялся распространять среди нескольких пользователей. Цель состояла в том, чтобы обновить WPF с определенной информацией, когда новые строки были добавлены в базу данных. Я думал, что это будет лучший способ сделать это, а не всегда запрашивать базу данных.
private void ConnectToDatabase()
{
//This method is the first to be called, and is the entry
// point into my SQL database code.
databaseConnection = new SqlConnection(connectionString);
// Setup command used in SqlDependecy
SqlCommand tempCmd = new SqlCommand();
tempCmd.Connection = databaseConnection;
tempCmd.CommandText = "SELECT COUNT(ID) FROM [Example].[dbo].[ExampleTable]";
sqlCmd = tempCmd;
try
{ databaseConnection.Open(); }
catch (Exception e)
{ writeDebug(e.ToString()); }
}
private void SetupSQLDependency()
{
SqlDependency.Stop(connectionString);
SqlDependency.Start(connectionString);
sqlCmd.Notification = null;
// create new dependency for SqlCommand
SqlDependency sqlDep = new SqlDependency(sqlCmd);
sqlDep.OnChange += new OnChangeEventHandler(sqlDep_OnChange);
SqlDataReader reader = sqlCmd.ExecuteReader();
}
private void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
{
// FROM: http://msdn.microsoft.com/en-us/a52dhwx7.aspx
if (e.Type == SqlNotificationType.Change)
{
//++++++ THIS IS THE BLOCK THAT IS NEVER TRIGGERED ++++++//
// Have to remove this as it only work's once
SqlDependency sqlDep = sender as SqlDependency;
sqlDep.OnChange -= sqlDep_OnChange;
// Resetup Dependecy
SetupSQLDependency();
}
else if (e.Type == SqlNotificationType.Subscribe)
{
double te = 12; // Used this just to test a break... code is useless
}
}
Можете ли вы уточнить, где этот код существует, как он называется? Например, если этот код существует в 'Page' и вызывается в событии OnLoad, тогда вы должны помнить, что ваш класс страницы жив только в течение секунды секунды, пока страница отображается, а затем весь новый класс для каждого запроса. Таким образом, ваша подписка на события и экземпляр переменной 'sqlCmd' не поддерживаются (и теоретически возникают утечки памяти). – CodingGorilla
Сделали изменения выше – keynesiancross
ОК, по какой-то причине я думал, что вы делаете это в ASP.NET. Так что ваш 'SqlNotificationType.Change' огонь один раз и только один раз или вообще никогда? – CodingGorilla