edge
edge copied to clipboard
Async events with SqlClient libs
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();
}
}
}
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.
If anyone had an idea to make this work I would greatly appreciate.
Thks