Я использую SqlDependecy
с signalR
нажать уведомления в браузер клиента, когда есть некоторые изменения в базе данных, я последовал this и this поста и все работает отлично в локальной SqlExpress
версии 11.0 с локальной строки подключения, но у меня есть какие-то проблемы разрешений, когда я подключиться к удаленной базе данных, размещенной в GoDaddy с колонной ПодключениеНе удается найти объект «QueryNotificationErrorsQueue», потому что не существует или у вас нет разрешения
Рабочая Местное ConnectionString
<!--<add name="NotifyConnection" providerName="System.Data.SqlClient" connectionString=
"Data Source=.\SQLExpress;Initial Catalog=TestDB;Integrated Security=SSPI;" />-->
Производство ConnectionString
<add name="NotifyConnection" connectionString="Server=000.00.00.000;Database=TestDB;
User Id=UserName;Password=YourPassword;" providerName="System.Data.SqlClient" />
Получ данных
public IEnumerable<Order> GetData()
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings
["NotifyConnection"].ConnectionString))
{
using (SqlCommand command = connection.CreateCommand())
{
command.CommandType = CommandType.Text;
command.CommandText = "SELECT OrderID,CustomerID FROM dbo.[RestUser]";
command.Notification = null;
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
using (var reader = command.ExecuteReader())
return reader.Cast<IDataRecord>() // Here the Error throws
.Select(x => new Order()
{
OrderID = x.GetInt32(0),
CustomerID = x.GetInt32(1)
}).ToList();
}
}
}
Что я попробовал?
Я последовал за этим post, чтобы получить разрешения на сервере sql, но не уверен, что это правильный метод.
USE YourDatabaseName;
CREATE QUEUE NameChangeQueue;
CREATE SERVICE NameChangeService ON QUEUE NameChangeQueue ([http://schemas.microsoft.com/
SQL/Notifications/PostQueryNotification]);
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO YourUserName; // Here i get this error:
//Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema,
sys, or yourself.
ALTER DATABASE YourDatabaseName SET ENABLE_BROKER; // Broker is already enabled
Screen Shot:
Я новичок в SqlDependency
, как решить эту проблему?
Любая помощь будет отличной.
Ознакомьтесь с соображениями сетевой и аутентификации в [этом ответе] (http://stackoverflow.com/a/8316200/707618). Кроме того, где в коде вы вызываете ['SqlDependency.Start()'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.start (v = vs.110) .aspx)? – Smudge202
@ Smudge202 Спасибо за комментарий, я вызываю его в 'Appliaction_Start', и мы планируем перейти на azure, но в лазурной строке' SqlDependency' не поддерживается, поэтому мы получаем [this] (http://stackoverflow.com/ вопросы/33693020/azure-sql-server-error-statement-receive-msg-is-not-supported-in-this-version), которые планируется использовать для [триггеров] (http://stackoverflow.com/questions/ 9880091/monitor-data-changes-in-sql-azure), чтобы отслеживать изменения базы данных с помощью signaR, любые лучшие предложения? – stom
Лично я не большой поклонник подхода SqlDependency и Trigger. Вместо этого я бы рассмотрел возможность публикации сообщений на служебной шине (или в очереди какой-то формы). Один слушатель может сохранять данные в базе данных (как я уверен, что вы сейчас это делаете), в то время как другой слушатель может обрабатывать ваши push-оповещения SignalR. Он не только решает эту проблему, но и дает вам уровень устойчивости к отключению службы. Вот как я подхожу к нему, но я понимаю, что это не решает проблемы SqlDependency напрямую, извините. – Smudge202