0

Я разрабатываю приложение с функцией SQL Dependency. Когда я выполняю приложение, подписка не была зарегистрирована. и sys.dm_qn_subscriptions не имеет входа. я использовал SQL Profiler для отслеживания проблемы и я заметил, что подписка не была зарегистрирована как я не получил сообщение 1 – Subscription registered, но вместо этого получил 3 – subscription fired со следующим сообщением Извещение:Неподписана подписка на SQLDependency и сообщение уведомления о запросе с параметрами источника и опциями Info

<qnev:QNEvent xmlns:qnev="http://schemas.microsoft.com/SQL/Notifications/QueryNotificationProfiler"><qnev:EventText>subscription fired</qnev:EventText><qnev:SubscriptionID>0</qnev:SubscriptionID><qnev:NotificationMsg>&lt;qn:QueryNotification xmlns:qn="http://schemas.microsoft.com/SQL/Notifications/QueryNotification" id="0" type="subscribe" source="statement" info="set options" database_id="0" sid="0x01"&gt;&lt;qn:Message&gt;2c231f39-60c7-4a73-b575-617a791930f3;d06f0979-8f9b-490e-90ca-6042ab38d68c&lt;/qn:Message&gt;&lt;/qn:QueryNotification&gt;</qnev:NotificationMsg><qnev:BrokerDlg>2FAE7196-0E30-E411-8F82-0050569E473E</qnev:BrokerDlg></qnev:QNEvent> 

и когда я проверил это следующая информация:

Type: Subscription, Source: Statement and Info: set options 

и когда я проверил MSDN смысла он говорит The connection options were not set appropriately when the command was submitted.

это строка соединения я использую

<add name="DefaultConnection" connectionString="Data Source=crmserver;Initial Catalog=crmdatabase;Persist Security Info=True;User ID=sa;Password=mypassword" /> 

и Ниже приведен код, я использую:

public List<Customer> GetLeadUpdates(SqlDependency dependency) 
    { 
     using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) 
     { 
      var query = "SELECT id, name, salary FROM [dbo].[CustomerTest]"; 
      connection.Open(); 
      using (var command = new SqlCommand(query, connection)) 
      {     
       command.Notification = null; 
       dependency.AddCommandDependency(command); 
       if (connection.State == ConnectionState.Closed) 
        connection.Open();     
       var reader = command.ExecuteReader(); 
       var list = new List<Customer>(); 
       while (reader.Read()) 
       { 
        var customer = new Customer(); 
        customer.Id = (int) reader["id"]; 
        customer.Name = reader["name"].ToString(); 
        customer.Salary = (int) reader["salary"]; 
        list.Add(customer); 
       } 
       return list.OrderBy(p=>p.Id).ToList(); 
      } 
     } 
    } 

пожалуйста, дайте мне знать, что я должен сделать, чтобы успешно зарегистрировать подписку. Я включил сервис-брокер и использовал учетные данные «sa» в строке подключения для подключения к db, поэтому я полагаю, что мне не нужно какое-либо конкретное разрешение на подписку на уведомление, поскольку sa является dbo базы данных.

ответ

3

Проверьте параметры соединения SET сообщенных в Profiler для проверки следующих параметров SET эффективны:

ANSI_NULLS ON 
ANSI_PADDING ON 
ANSI_WARNINGS ON 
CONCAT_NULL_YIELDS_NULL ON 
QUOTED_IDENTIFIER ON 
NUMERIC_ROUNDABORT OFF 
ARITHABORT ON 

Обратите внимание, что ARITHABORT должен быть установлен ON явно после подключения, если совместимости базы данных установлены в 80 (SQL Server 2000).

+0

я выполнил DBCC Useroptions на SSMS и ResultSet показывает, что все, что вы упомянули уже включены: 'TextSize \t 2147483647', 'язык \t us_english', 'DateFormat \t MDY', 'DATEFIRST \t 7', ' lock_timeout \t -1' , 'quoted_identifier \t SET', 'ARITHABORT \t SET', ' ANSI_NULL_DFLT_ON \t SET', ' ANSI_WARNINGS \t SET', ' ANSI_PADDING \t SET', 'ANSI_NULLS \t SET', 'CONCAT_NULL_YIELDS_NULL \t SET', 'уровень изоляции \t чтения совершено' –

+0

Можете ли вы попробовать Profiler вместо SSMS? –

+0

Какие события я должен отслеживать в профилировщике, чтобы получить эти результаты? –