sql >> データベース >  >> RDS >> Sqlserver

SignalR を使用して SQL Server から Web アプリケーションにデータをプッシュする

    さて、SignalR.Client.NET.35 ライブラリについて少し遅れて気づきました。

    執筆時点では NuGet にパッケージ化されていないため、コードを ダウンロード GitHub SignalR プロジェクト サイトから、プロジェクトとしてソリューションに追加されます (両方の SignalR.Client.NET および SignalR.Client.NET35 必須)

    将来誰かを助けることができる場合に備えて、これが最終的な解決策です:

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

    重要な注意事項:コンパイル済みの SQL SERVER 2008R2 CLR ライブラリと共に、次の dll を同じフォルダーに配置する必要があります:

    • Newtonsoft.Json
    • 明らかにSignalR.Client.Net35
    • SM診断
    • System.Runtime.Serialization
    • 適切なバージョンの System.ServiceModel (互換性がない場合は、C:\Windows\assembly の GAC に記載されているバージョンを参照してください)。
    • System.Threading

    最後に 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 
    

    ut_sendMsgToHub を呼び出すには、サービス ブローカーを使用します。これにより、関数の実行に関する問題が、データを処理するストアド プロシージャから切り離されることが確実になります



    1. MySQLデータベースからの画像が印刷されない

    2. 不明な列数でのSQLServer2005のピボット

    3. Laravel4はRAWクエリ全体を実行できません

    4. ストアドプロシージャ内でDROPTABLEなどのコマンドを使用する方法