Случайные ошибки с моим соединением в C# с сервером SQL

Я создал этот класс для работы с моим подключением к БД. Приложения работают нормально, но один или два раза в день я получаю эту ошибку.

Неверная операция, соединение установлено. при выполнении запроса: (разные запросы)

или в другой раз я получил эту ошибку.

Время ожидания истекло. Время ожидания истекло до завершения операции, или сервер не отвечает. Эта ошибка произошла при попытке подключиться к серверу Принципал.

и редкие ошибки:

Ошибка на транспортном уровне при получении результатов с сервера. (провайдер: Session Provider, ошибка:? 19 - Вы не можете использовать соединение nf sica) при выполнении запроса

Тема прервана. при выполнении запроса:

ExecuteNonQuery требует открытого и доступного соединения. Текущее состояние соединения закрыто. при выполнении запроса

Мой класс БД (возобновлен):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Net.Mail;
using System.Web;
using System.IO;

namespace BBDD
{
    public class clsBBDD
    {
        private string strConexion;
        private int intTransaciones;
        private SqlTransaction Transaccion;
        private SqlConnection Conexion;

        public clsBBDD(string ParamConexion)
        {
            strConexion = ParamConexion;
            intTransaciones = 0;
        }

        public int Execute(string Sql)
        {
            return ExecutePrivado(Sql);
        }

        public int Execute(string Sql, bool Force)
        {
            return ExecutePrivado(Sql, Force);
        }

        private int ExecutePrivado(string Sql,bool Force = false)
        {
            int result = 0;
            SqlCommand sentencia;
            try
            {
                if (!Force && !Sql.ToUpper().Contains("WHERE") && !Sql.ToUpper().Contains("INSERT"))
                {
                    throw new Exception("Sentencia Update o Delete sin WHERE");
                }
                if (intTransaciones > 0)
                {
                    sentencia = new SqlCommand(Sql, Conexion, Transaccion);
                }
                else
                {
                    abrirConexion();
                    sentencia = new SqlCommand(Sql, Conexion);
                }
                sentencia.CommandTimeout = 0;
                result = sentencia.ExecuteNonQuery();
                cerrarConexion();
            }
            catch (Exception e)
            {
                SendMailError(Sql, e);
                result = 0; 
            }
            return result;
        }

        public bool AbrirTrans()
        {
            try
            {
                intTransaciones += 1;
                if (intTransaciones == 1)
                {
                    abrirConexion();
                    Transaccion = Conexion.BeginTransaction();
                }
            }
            catch (Exception e)
            {
                SendMailError("Error al abrir transacción", e);
                return false; 
            }
            return true;
        }

        public bool CerrarTrans(bool CommitTrans)
        {
            try
            {
                intTransaciones -= 1;
                if (intTransaciones == 0)
                {
                    if (CommitTrans)
                    {
                        Transaccion.Commit();
                    }
                    else
                    {
                        Transaccion.Rollback();
                    }
                    cerrarConexion();
                }
            }
            catch (Exception e)
            {
                SendMailError("Error al cerrar transacción", e);
                return false;
            }
            return true;
        }

        public object GetValue(string Sql)
        {
            object resultado = null;
            try
            {
                SqlCommand sentencia = getCommand(Sql);
                SqlDataReader reader = sentencia.ExecuteReader();

                while (reader.Read())
                {
                    resultado = reader[0];
                }
                reader.Close();

                cerrarConexion();
            }
            catch (Exception e)
            {
                SendMailError(Sql, e);
                resultado = null;
            }
            return resultado;
        }

        public DataRow GetValuesInRow(string sql)
        {
            DataRowCollection dsr;
            DataRow result;
            try
            {

                dsr = GetDSr(sql);
                if (dsr.Count > 0)
                {
                    result = dsr[0];
                }
                else
                {
                    result = null;
                }
            }
            catch (Exception e)
            {
                SendMailError(sql,e);
                result = null;
            }
            return result;
        }

        public DataSet GetDS(string Sql)
        {
            DataSet result = new DataSet();
            SqlDataAdapter adapter;
            try
            {
                SqlCommand command = getCommand(Sql);
                adapter = new SqlDataAdapter(command);
                adapter.Fill(result);
                cerrarConexion();
            }
            catch (Exception e)
            {
                SendMailError(Sql, e);
                result = null;
            }
            return result;
        }

        public DataRowCollection GetDSr(string sql)
        {
            DataRowCollection result;
            try
            {
                DataSet ds = GetDS(sql);
                result =  ds.Tables[0].Rows;
            }
            catch (Exception e)
            {
                SendMailError(sql, e);
                result = null;
            }
            return result;
        }

        private void abrirConexion()
        {
            Conexion = new SqlConnection(strConexion);
            if (Conexion.State == ConnectionState.Closed)
            {
                Conexion.Open();
            }
        }

        private void cerrarConexion(bool Force = false)
        {
            try
            {
                if (intTransaciones == 0 && Conexion != null)
                {
                    Conexion.Close();
                }
            }
            catch 
            {
            }
        }

        private SqlCommand getCommand(string Sql)
        {
            SqlCommand result;
            if (intTransaciones == 0)
            {
                abrirConexion();
            }
            result = Conexion.CreateCommand();
            if (intTransaciones > 0)
            {
                result.Transaction = Transaccion;
            }
            result.CommandText = Sql;
            result.CommandTimeout = 0;
            return result;
        }

    }
}

Как я инициализирую класс:

public partial class frmBase : System.Web.UI.Page
{
    protected clsBBDD BD;
    protected void Page_Init(object sender, EventArgs e)
    {
        BD = new clsBBDD(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        clsBase.BD = BD;
    }
}

Все мое наследие веб-форм от frmBase и все предложения от clsBase

Для использования BD я звоню так:

string sql;
DataRowCollection DSTrabajos;
sql = "UPDATE tabletest SET validacion = '" + ValidacionText + "', ModificadoPor = '" + Username + "' WHERE referencia = " + ReferenciaID;
BD.Execute(sql);
sql = "SELECT orderID FROM TrabajosINBOX where referencia = " + ReferenciaID;

DSTrabajos = BD.GetDSr(sql);

foreach (DataRow r in DSTrabajos)
{
    //more code inside
}

Мои параметры строки подключения

Data Source=ServerIP;Initial Catalog=BBDDNAME;User ID=USER;Password=***********;Max Pool Size=500;MultipleActiveResultSets=true

1 ответ

Когда я добавляю CommandTimeout = 0 во все SqlCommand моего класса, следующая ошибка исчезает

"Время ожидания истекло. Время ожидания истекло до завершения операции, или сервер не отвечает. Эта ошибка произошла при попытке подключения к серверу Принципал".

Но теперь продолжим вторую ошибку, особенно на эту:

"Неверная операция, соединение установлено. При выполнении запроса: (разные запросы)"

Другие вопросы по тегам