I am developing a task that basically executes a series of stored procedures for each branch that exists in our company, for this I use the task that comes in the .net framework 4.0 but when executed 50 times the procedure throws an exception in the catch and it's referring to the connection:
System.InvalidOperationException: ExecuteNonQuery requires an open and available Connection. The current state of the connection is open.
I always keep the connection open, the idea is that when I finish running all the Store procedures the connection is closed but I can not find the way to do it, since it only executes an approximate of 50 SP and the error occurs
Main method:
public static void Main(string[] args)
{
Console.WriteLine("--INICIO DEL PROCESO. {0:dd-MM-yyyy HH:mm}", HORA_INICIAL);
Console.WriteLine("---------------------------------------");
Console.WriteLine();
DateTime inicio = DateTime.Now;
DataSet dsTiendas = getTiendas();
DataSet dsProcedures = getProcedimientos();
int sizeT = dsTiendas.Tables["Tienda"].Rows.Count;
int sizeP = dsProcedures.Tables["Procedure"].Rows.Count;
int i;
string serverDb, procedure, tienda = "";
if (sizeT > 0 && sizeP > 0)
{
OpenConnection(true);
for (i = 0; i < sizeT; i++)
{
serverDb = dsTiendas.Tables["Tienda"].Rows[i]["SERVERDB"].ToString();
tienda = dsTiendas.Tables["Tienda"].Rows[i]["U_TIENDA"].ToString() + ": " + dsTiendas.Tables["Tienda"].Rows[i]["NOMBRE"].ToString();
Console.WriteLine("Incio de Ejecucion de procesos Tienda: " + tienda);
Console.WriteLine("IP: " + dsTiendas.Tables["Tienda"].Rows[i]["DIRECCIONIP"].ToString());
for (int j = 0; j < sizeP; j++)
{
procedure = dsProcedures.Tables["Procedure"].Rows[j]["NOMBRE"].ToString();
Console.WriteLine("Procedimiento: " + procedure);
Console.WriteLine("--Inicio del proceso. {0:dd-MM-yyyy HH:mm}", DateTime.Now);
Task t = Task.Factory.StartNew(() => ejecutarNonQuery("EXEC " + procedure + " '" + serverDb + "'"));
Console.WriteLine("--Fin del proceso. {0:dd-MM-yyyy HH:mm}", DateTime.Now);
}
}
Console.WriteLine("Fin de la tarea " + tienda);
Console.WriteLine("--Hora finalizada. {0:dd-MM-yyyy HH:mm}", HORA_INICIAL);
}
CloseConnection(true);
System.Threading.Thread.Sleep(30);
}
Methods to open / close connection:
private static void OpenConnection(bool pMantenerConexionAbierta = false)
{
InitDB();
if (!(con.State == ConnectionState.Open))
{
con.Open();
MantenerConexionAbierta = pMantenerConexionAbierta;
}
}
public static void CloseConnection(bool FinalizarConexionAbierta = false)
{
if (FinalizarConexionAbierta)
{
MantenerConexionAbierta = false;
}
if (con.State == ConnectionState.Open & !MantenerConexionAbierta)
{
con.Close();
}
}
Method to execute queries
static public void ejecutarNonQuery(object dbQuerys)
{
string dbQuery = dbQuerys.ToString();
//bool respuesta = false;
if (dbQuery.Trim().Length == 0)
{
return;
}
using (SqlCommand cmd = getCommand(dbQuery, false))
{
try
{
cmd.ExecuteNonQuery();
//respuesta = true;
}
catch (Exception ex)
{
LogError(dbQuery, ex.ToString(), ex.StackTrace);
//respuesta = false;
}
finally
{
}
}
//return respuesta;
}