Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wypychanie danych z programu SQL Server do aplikacji sieci Web za pomocą SignalR

Cóż, trochę późno zdałem sobie sprawę z biblioteki SignalR.Client.NET.35.

W chwili pisania tego tekstu nie jest on spakowany w NuGet, więc kod należy pobrać z witryny projektu GitHub SignalR i dodane jako projekt do rozwiązania (zarówno SignalR.Client.NET i SignalR.Client.NET35 wymagane).

Oto ostateczne rozwiązanie, na wypadek gdyby mogło komuś pomóc w przyszłości:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Xml;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Net;
using System.IO;
using System.Xml.XPath;
using SignalR.Client.Hubs;

    internal static HubConnection connectionT = null;
    internal static IHubProxy msgHubT = null;

    /// <summary>
    /// allows SSRV to send a message to the Web Socket hub
    /// </summary>
    /// <param name="URL">URL of the Hub</param>
    /// <param name="hubName">Name of the message Hub to be used for broadcasting.</param>
    /// <param name="hubMethod">Hub method to be used for broadcasting.</param>
    /// <param name="message">Message to be broadcasted.</param>
    [SqlFunction()]
    public static void ut_sendMsgToHub(string URL, string hubName, string hubMethod, string message)
    { 
      try
        {
        if (connectionT == null)
        {
            connectionT = new HubConnection(URL.Trim()); // "http://localhost:56844/M2Hub"
        }
        if (msgHubT == null)
        {
            msgHubT = connectionT.CreateProxy(hubName.Trim());//"M2data"
        }

            if (!(connectionT.State == SignalR.Client.ConnectionState.Connected 
                || connectionT.State == SignalR.Client.ConnectionState.Reconnecting
                 || connectionT.State == SignalR.Client.ConnectionState.Connecting))
                connectionT.Start().Wait();
            msgHubT.Invoke(hubMethod.Trim(), message.Trim()).Wait();//"Send"
        }
        catch (Exception exc)
        {
            SqlContext.Pipe.Send("ut_sendMsgToHub error: " + exc.Message + Environment.NewLine);
        }
    }

Ważna uwaga:razem ze skompilowaną biblioteką SQL SERVER 2008R2 CLR będziesz musiał umieścić następujące dll w tym samym folderze:

  • Newtonsoft.Json
  • SignalR.Client.Net35 oczywiście
  • SMdiagnostyka
  • System.Runtime.Serialization
  • System.ServiceModelin we właściwej wersji (w przypadku niezgodności odnieś się do wersji podanej w GAC w C:\Windows\assembly).
  • Wątek systemowy

wreszcie w SQL SERVER:

CREATE ASSEMBLY CLR_Bridge from 'C:\PathToLibraries\Library_CLR.dll' 
WITH PERMISSION_SET = UNSAFE --UNSAFE required
CREATE PROCEDURE ut_sendMsgToHub 
@url nchar(125) ,
@hubName nchar(75),
@hubMethod NCHAR(75),
@message NVARCHAR(MAX)
AS
EXTERNAL NAME CLR_Bridge.[LibraryNamespace.CLR_Bridge].ut_sendMsgToHub 

Aby wywołać ut_sendMsgToHub używam brokera usług, dzięki czemu mam pewność, że każdy problem z wykonaniem funkcji jest oddzielony od procedur składowanych przetwarzających dane



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja w SQL Server 2008 podobna do GREATEST w mysql?

  2. Obliczona kolumna w EF Code First

  3. Czy możemy zainstalować edycję Express i edycję Standard SQL Server na tym samym komputerze użytkownika?

  4. SSRS 2008 — Jednolite legendy wykresów dla raportu z wieloma wykresami

  5. Skopiuj bazę danych SQL Server Express na inny komputer