使用sql server在c#中连接的随机错误

时间:2014-09-16 15:05:27

标签: c# asp.net sql-server sqlconnection sqlclient

我已经使用我的数据库连接创建了这个类。 应用程序工作正常但一天中有一两次我得到了这个错误。

操作无效,连接完成。运行查询时:(不同的查询)

或其他时候我收到此错误。

超时值已超时。超时期限在操作完成或服务器未响应之前到期。尝试连接到服务器Principal时发生此错误。

和罕见的错误:

从服务器接收结果时传输级别出错。 (提供者:会话提供者,错误:?19 - 您无法使用nf sica的连接)运行查询

线程已中止。执行查询时:

ExecuteNonQuery需要一个开放且可用的连接。连接的当前状态已关闭。在运行查询时

我的db类(已恢复):

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的所有webforms遗产以及来自clsBase的所有clases heritatge

对于使用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 个答案:

答案 0 :(得分:0)

当我在我班级的所有SqlCommand中添加CommandTimeout = 0时,下一个错误消失

"值超时已过期。超时期限在操作完成或服务器未响应之前到期。尝试连接到服务器Principal时发生此错误。"

但现在继续发生另一个错误,特别是这个错误:

"操作无效,连接完成。运行查询时:(不同的查询)"