2015-01-15 1 views
3

Мы разрабатываем приложение WPF с использованием SqlDependencies для обновления приложения в соответствии с базой данных. Мы узнали несколько раз, что уведомления о запросах выглядят нерегулярными - приложение не показывает последнее состояние базы данных. Как только кто-то что-то изменит на столе, приложение быстро обновляется и отображает последнее состояние.SqlDependency - предотвратить dataloss между событием и повторной регистрацией запроса снова?

Теперь я написал инструмент, который как можно быстрее изменяет базу данных на определенное количество раз и другой инструмент, который регистрирует SqlDependencies и просто подсчитывает, сколько SqlDependencies было вызвано.

private void AddNewQuery(string query) 
{ 
    using (var connection = new SqlConnection(_connectionString)) 
    { 
    connection.Open(); 
    var command = new SqlCommand(query, connection); 
    var dependency = new SqlDependency(command); 

    dependency.OnChange += OnQueryChanged; 
    } 
} 

private void OnQueryChanged(object sender, SqlNotificationEventArgs e) 
{ 
    AddNewQuery('SELECT Foo,Bar FROM dbo.Foobar');  
    OnDatabaseChanged(); 
    var dependency = sender as SqlDependency; 
    dependency.OnChange -= OnQueryChanged; 
} 

private void OnDatabaseChanged() 
{ 
    lock(_databaseChangedLocker) 
    _counter++; 
} 

По-видимому, тем быстрее выполняется основное приложение, тем меньше уведомлений распознаются SqlDependency-Reader. Например: Я запускать 1000 запросов в несколько раз:

9,2 секунды Итоговые результаты времени выполнения в 520 уведомлений, полученных (52%) 14 секунд Итоговые результаты времени выполнения в 822 уведомлений (82,2%) 19,3 секунды Общий пробег дает 957 уведомлений (95,7%).

Есть ли способ предотвратить этот тип dataloss и гарантировать, что каждое изменение приводит к QueryNotification? Мы запускаем SQL Server 2008 R2.

ответ

0

Прежде чем обновлять свой графический интерфейс, вы должны, вероятно, зарегистрировать новую SqlDependency. Таким образом, вы всегда будете иметь последнее состояние, независимо от того, сколько изменений было в это время.