2015-08-10 1 views
0

FIXED: обновлен код, который теперь работает.SqlDependency Data Наводнение при использовании COUNT_BIG() в запросе

Попытка установить веб-сайт для панели управления, где мне нужны запросы, используя поля count_big() и предложения GROUP BY. Стандартные списки наборов записей отлично работают, но как только я добавляю count_big(), websocket не прекращает отправлять данные. У меня есть read this post about limitations, а count_big() отображается ОК для использования. TIA

using Microsoft.Web.WebSockets; 
    using System; 
    using System.Collections.Generic; 
    using System.Configuration; 
    using System.Data; 
    using System.Data.SqlClient; 
    using System.Linq; 
    using System.Net; 
    using System.Net.Http; 
    using System.Web; 
    using System.Web.Http; 

    namespace DatabaseChangeNotification.Controllers 

{ 
    public class DatabaseNotificationController : ApiController 
    { 
     public HttpResponseMessage Get() 
     { 
      HttpContext.Current.AcceptWebSocketRequest(new ChatWebSocketHandler()); 
      return Request.CreateResponse(HttpStatusCode.SwitchingProtocols); 
     } 

     class ChatWebSocketHandler : Microsoft.Web.WebSockets.WebSocketHandler 
     { 

      public string wsData = null; 
      public SqlCommand gblCommand = null; 

      public ChatWebSocketHandler() 
      { 
       SetupNotifier(); 
      } 

      protected void SetupNotifier() 
      { 
       using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) 
       { 
        connection.Open(); 
        // DO NOT USE any "*" in queries 
        // WHen using count the variable was converted to string. Got Data flood 
        // 
        // Testing count_big data type 
        // getString failed 
        // 
        using (SqlCommand command = new SqlCommand(@"select [address], count_big(*) as [CurrentTotal] from dbo.users where address = 'main st' group by address", connection)) 
        { 
         command.Notification = null; 
         SqlDependency dependency = new SqlDependency(command); 
         dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
         if (connection.State == ConnectionState.Closed) 
         { 
          connection.Open(); 
         } 
         //SqlCommand gblCommand = command; 
         wsData = null; 
         using (SqlDataReader reader = command.ExecuteReader()) 
         { 
          while (reader.Read()) 
          { 

           /* MUST MATCH column count and column data type */ 

           // wsData += reader.GetString(0) + " " + reader.GetString(1) + " " + reader.GetString(2); 

           /* THIS WORKS FOR GETTING NUMERIC VARIABLES */ 
           wsData += reader.GetValue(0) + " " + int.Parse(reader.GetValue(1).ToString()); 

           // wsData += reader.GetString(0) + "</br>"; //works but we get data flood and no numbers 


          } 
          // reader.Close(); 
         } 
         _chatClients.Broadcast("data: " + wsData); 

        } 
       } 
      } //SetupNotifier 

      private static WebSocketCollection _chatClients = new WebSocketCollection(); 

      public override void OnOpen() 
      { 
       _chatClients.Add(this); 
      } // OnOpen 

      public override void OnMessage(string msg) 
      { 
      } // OnMessage 

      private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
      { 

      if (e.Type != SqlNotificationType.Change) 
      { 
       _chatClients.Broadcast("Returning, not a change notification "); 
       return; 
      } 

       /* 
       * Must remove dependency. Only works once. 
       */ 
       SqlDependency dependency = sender as SqlDependency; 
       dependency.OnChange -= dependency_OnChange; 

       //reset for next message. 
       SetupNotifier(); 

      } // dependency_OnChange 
     } // ChatWebSocketHandler 

    } // DatabaseNotificationController 
} 

ПРИМЕЧАНИЕ: Это происходило до того, как был исправлен код.

Web Socket returns infinite listing: 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    data: main st 1 
    { .....} 

ответ

1

Вы должны проверить SqlNotificationEventArgs членов. Не все уведомления указывают на обновление. Некоторые уведомления (например, те, которые вы получаете) указывают на неверные условия или неверный запрос. Вы получаете уведомление о недопустимом запросе и повторно отправляете, чтобы быть немедленно уведомленным по той же причине. Ad-оскомину.

Осмотр уведомления указывает на проблему. В вашем случае проблема указана в самой первой точке пули в канале себя публикуемую:

имена таблиц должны быть квалифицированы с именами двух частей

+0

SqlNotificationEventArgs: информация: Invalid источник: Заявление Какие-нибудь идеи, что не так? Я изменил имя таблицы на dbo.users, и это не помогло. выберите dbo.users.address, count_big (dbo.users.address) в качестве [CurrentTotal] из dbo.users, где dbo.users.address = 'main st' group by dbo.users.address – Jim

+0

FIXED: Remus, спасибо, что указал мне в правильном направлении. Конечный запрос, который работает: select [address], count_big () в качестве [CurrentTotal] из dbo.users, где [адрес] = 'главная st' группа по [адресу] Уведомление об изменении count_big () на count_big (*) , и GODB.DBO.Users для DBO.users. ТАКЖЕ добавляется, если (e.Type! = SqlNotificationType.Change) { _chatClients.Broadcast («Возврат, а не уведомление об изменении»); возвращение; } функции dependency_OnChange() – Jim

Смежные вопросы