edge icon indicating copy to clipboard operation
edge copied to clipboard

Async events with SqlClient libs

Open apfelgluck opened this issue 6 years ago • 0 comments

Hello every one.

I have an issue when using edge to execute sql queries.


With the c# version everything goes fine. Events are fired asynchronously :

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;

namespace pocSqlAsynch
{
    class Program
    {
        static void Main(string[] args)
        {
            string serverName = "localhost\\MSSQL2016";
            string databaseName = "master";
            string query =
                 "RAISERROR('1',10,1) WITH NOWAIT"+Environment.NewLine+
                 "waitfor delay '00:00:05'" + Environment.NewLine +
                 "RAISERROR('1', 10, 1) WITH NOWAIT" + Environment.NewLine +
                 "waitfor delay '00:00:05'" + Environment.NewLine +
                 "RAISERROR('1', 10, 1) WITH NOWAIT" + Environment.NewLine +
                 "waitfor delay '00:00:05'";

            DataSet dataSet = new DataSet();

            SqlConnection sqlCon = new SqlConnection("Server=" + serverName + ";Database=" + databaseName + ";Integrated Security=SSPI;Application Name = testEdge");

            ServerConnection serverCon = new ServerConnection(sqlCon);

            serverCon.StateChange += (Object source, System.Data.StateChangeEventArgs e) => {

                Console.WriteLine("---> stateChange (" + DateTime.Now.ToString() + ") : "+e.CurrentState);
            };

            serverCon.InfoMessage += (Object source, System.Data.SqlClient.SqlInfoMessageEventArgs e) => {

                Console.WriteLine("---> message (" + DateTime.Now.ToString() + ") : "+e.Message);
            };

            Console.WriteLine("---> start (" + DateTime.Now.ToString() + ")");

            dataSet = serverCon.ExecuteWithResults(query);

            Console.WriteLine("---> end (" + DateTime.Now.ToString() + ")");

            Console.ReadLine();
        }
    }
}

c _asynch

As you can see, events a fired and received every 5 sec.


When using edge, i cannot figure how to make the events asynchronous.

var edge = require('edge-js');
    
    var sqlFunction = edge.func(
    function () {
        /*

        #r "System.Data.dll"
        #r "System.Xml.dll"
        #r "Microsoft.SqlServer.ConnectionInfo.dll"

        using System;
        using System.Data;
        using System.Threading;
        using System.Threading.Tasks;
        using System.Data.SqlClient;
        using System.Xml.Serialization;
        using Microsoft.SqlServer.Management.Common;

        public class Startup
        {
            public async Task Invoke(dynamic input)
            {
                string serverName = "localhost\MSSQL2016";
                string databaseName = "master";
                string query =
                "RAISERROR('1',10,1) WITH NOWAIT"+Environment.NewLine+
                "waitfor delay '00:00:05'" + Environment.NewLine +
                "RAISERROR('1', 10, 1) WITH NOWAIT" + Environment.NewLine +
                "waitfor delay '00:00:05'" + Environment.NewLine +
                "RAISERROR('1', 10, 1) WITH NOWAIT" + Environment.NewLine +
                "waitfor delay '00:00:05'";

                DataSet dataSet = new DataSet();

                SqlConnection sqlCon = new SqlConnection("Server=" + serverName + ";Database=" + databaseName + ";Integrated Security=SSPI;Application Name = testEdge");

                ServerConnection serverCon = new ServerConnection(sqlCon);

                serverCon.StateChange += (Object source, System.Data.StateChangeEventArgs e) => {
                    ((Func<object,Task<object>>)input.stateChangeEventHandler)(e);
                };

                serverCon.InfoMessage += (Object source, System.Data.SqlClient.SqlInfoMessageEventArgs e) => {
                    ((Func<object,Task<object>>)input.infoMessageEventHandler)(e);
                };

                dataSet = serverCon.ExecuteWithResults(query);

                return "";
            }
        }
        */
    });

    var input ={
        stateChangeEventHandler: function (data, callback) {
            var date = new Date();
            console.log("----> stateChange ("+ date.toGMTString() +") : " + data.CurrentState);
            callback(error, result)
        },
        infoMessageEventHandler: function (data, callback) {
            var date = new Date();
            console.log("----> infoMessage ("+ date.toGMTString() +") : " + data.Message);
            callback(error, result)
        }
    };

    var date = new Date();
    console.log("----> start ("+ date.toGMTString() +") ");

    sqlFunction(
        input,
        function (error, payload) {
            if (error) throw error;
            date = new Date();
            console.log("----> end ("+ date.toGMTString() +")");
            }
    );

as shown below, the events are fire all together once the sql execution is compete.

edje_asynch

If anyone had an idea to make this work I would greatly appreciate.

Thks

apfelgluck avatar Aug 29 '18 09:08 apfelgluck