sql >> Database >  >> RDS >> Sqlserver

Gegevens van SQL Server naar webtoepassing pushen met SignalR

Nou, ik realiseerde me een beetje laat over de SignalR.Client.NET.35-bibliotheek.

Op het moment van schrijven is het niet verpakt in NuGet, dus de code moet gedownload zijn van de GitHub SignalR Project Site en toegevoegd als een project aan de oplossing (beide SignalR.Client.NET en SignalR.Client.NET35 vereist).

Hier is de definitieve oplossing, voor het geval het iemand in de toekomst kan helpen:

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);
        }
    }

Belangrijk om op te merken:samen met de gecompileerde SQL SERVER 2008R2 CLR-bibliotheek moet u de volgende dll's in dezelfde map plaatsen:

  • Newtonsoft.Json
  • SignalR.Client.Net35 uiteraard
  • SM-diagnose
  • System.Runtime.Serialisatie
  • System.ServiceModelin de juiste versie (raadpleeg de versie zoals vermeld in de AVV in C:\Windows\assembly in geval van incompatibiliteit).
  • System.Threading

eindelijk in 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 

Om ut_sendMsgToHub aan te roepen, gebruik ik een servicebroker, zodat ik zeker weet dat elk probleem met de uitvoering van de functie wordt losgekoppeld van de opgeslagen procedures die de gegevens verwerken



  1. Reguliere expressie in PostgreSQL LIKE-clausule

  2. Door komma's gescheiden waarde en jokertekens in mysql

  3. Slow ORDER BY in grote tafel

  4. Hoe elke rij te selecteren waar de kolomwaarde NIET verschillend is