【Winform】程序长时间运行后,提示数据库连接失败

时间:2022-09-17 09:05:59
以下是我的数据库连接代码

        public static bool Execute(string commandText)
        {
            bool result = false;
            try
            {
                SqlConnection conn = Connect();
                SqlCommand command = new SqlCommand(commandText, conn);
                command.Connection.Open();
                if (command.ExecuteNonQuery() > 0)
                {
                    result = true;
                }
                conn.Close();
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static SqlDataReader Search(string cmdText, CommandType type, params SqlParameter[] param)
        {
            SqlConnection connection = Connect();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = connection;
            cmd.CommandText = cmdText;
            cmd.CommandType = type;
            if (param.Length > 0)
            {
                foreach (SqlParameter p in param)
                {
                    cmd.Parameters.Add(p);
                }
            }
            connection.Open();
            SqlDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return read;
        }
        public static Object Scalar(string cmdText, CommandType type, params SqlParameter[] param)
        {
            object i = null;
            using (SqlConnection con =Connect())
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandText = cmdText;
                cmd.CommandType = type;
                if (param.Length > 0)
                {
                    foreach (SqlParameter p in param)
                    {
                        cmd.Parameters.Add(p);
                    }
                }
                con.Open();
                i = cmd.ExecuteScalar();
                return i;
            }
        }

下面是我每15分钟执行时必须每次要做的,首先查询设备信息,其次提取设备里的信息,提取后与之前
提取过并存入数据库的表,进行比对,如果数据不存在就插入


   //查询设备信息
       public static List<MachineInfoModel> GetMachineInfo()
        {
            List<MachineInfoModel> l = new List<MachineInfoModel>();
            string sql = "select eqp_id,ip,port from machinespec";
            SqlDataReader read = DBHelper.Search(sql, CommandType.Text);
            while (read.Read())
            {
                MachineInfoModel m = new MachineInfoModel();
                m.Eqp_id = read[0].ToString();
                m.Ip = read[1].ToString();
                m.Port = int.Parse(read[2].ToString());
                l.Add(m);
            }
            read.Close();
            return l;
        }


        //判断数据是否有重复
       public static int GetDistinctData(string ssn, string checktime, string checktype, string eqpid)
        {
            string sql = "select count(*) from checkinout where BADGENUMBER='"+ssn+"' and CHECKTIME='"+checktime+"' AND CHECKTYPE='"+checktype+"' AND EQP_ID='"+eqpid+"'";
            object read = DBHelper.Scalar(sql, CommandType.Text);
            if (read != null)
                return int.Parse(read.ToString());
            else
                return 0;
        }
     //如果无重复就插入数据
       public static bool AddCheckInOutInfo(string ssn,string checktime,string checktype,string eqpid)
        {
            string sql = "insert into checkinout values('"+ssn+"','"+checktime+"','"+checktype+"','"+eqpid+"','"+DateTime.Now+"')";
            return DBHelper.Execute(sql);
        }

10 个解决方案

#1


代码上看都是没什么,会不会是网络问题或者服务器问题

#2


引用 1 楼  的回复:
代码上看都是没什么,会不会是网络问题或者服务器问题

所以我想把我代码直接贴出来,看是不是我的代码哪里有问题。

#3


这代码都是没问题的,,
程序多长时间后,提示数据库连接失败?
重新启动后还这样?

#4


引用 3 楼  的回复:
这代码都是没问题的,,
程序多长时间后,提示数据库连接失败?
重新启动后还这样?

前天开始测试,前天和昨天23点出现的问题。
其次重新启动需要在早上,早上重新启动程序后没有问题。

#5


什么情况下出现数据库连接失败?是不是中途有其它的后台处理动作呢?

#6


  public static SqlDataReader Search(string cmdText, CommandType type, params SqlParameter[] param)
        {
            SqlConnection connection = Connect();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = connection;
            cmd.CommandText = cmdText;
            cmd.CommandType = type;
            if (param.Length > 0)
            {
                foreach (SqlParameter p in param)
                {
                    cmd.Parameters.Add(p);
                }
            }
            connection.Open();
            SqlDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return read;
        }

这一段代码是不是差一个connection.Close();?

#7


是不是因为程序发生异常时数据库连接没有释放,导致连接池已满。。

#8


如果都是23点出问题,你直接将系统设为22.59,然后再运行程序,看看还是否报错?
另外你的代码中对SqlConnection和SqlDataReader的使用最好改成
using(SqlConnection connection = Connect())
{
  SqlCommand cmd = new SqlCommand();
  cmd.Connection = connection;
  cmd.CommandText = cmdText;
  cmd.CommandType = type;
  if (param.Length > 0)
  {
  foreach (SqlParameter p in param)
  {
  cmd.Parameters.Add(p);
  }
  }
  connection.Open();
}
这样就不用担心会遗漏释放资源了

#9


首先,写个日志记录方法来记录详细的抱错信息,在每个catch里调用。看看是哪个地方的catch

#10


下面是以前我遇到过的错误,也是程序运行一段时间后才出现的,是因为没有及时关闭数据库连接。

超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。

#1


代码上看都是没什么,会不会是网络问题或者服务器问题

#2


引用 1 楼  的回复:
代码上看都是没什么,会不会是网络问题或者服务器问题

所以我想把我代码直接贴出来,看是不是我的代码哪里有问题。

#3


这代码都是没问题的,,
程序多长时间后,提示数据库连接失败?
重新启动后还这样?

#4


引用 3 楼  的回复:
这代码都是没问题的,,
程序多长时间后,提示数据库连接失败?
重新启动后还这样?

前天开始测试,前天和昨天23点出现的问题。
其次重新启动需要在早上,早上重新启动程序后没有问题。

#5


什么情况下出现数据库连接失败?是不是中途有其它的后台处理动作呢?

#6


  public static SqlDataReader Search(string cmdText, CommandType type, params SqlParameter[] param)
        {
            SqlConnection connection = Connect();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = connection;
            cmd.CommandText = cmdText;
            cmd.CommandType = type;
            if (param.Length > 0)
            {
                foreach (SqlParameter p in param)
                {
                    cmd.Parameters.Add(p);
                }
            }
            connection.Open();
            SqlDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return read;
        }

这一段代码是不是差一个connection.Close();?

#7


是不是因为程序发生异常时数据库连接没有释放,导致连接池已满。。

#8


如果都是23点出问题,你直接将系统设为22.59,然后再运行程序,看看还是否报错?
另外你的代码中对SqlConnection和SqlDataReader的使用最好改成
using(SqlConnection connection = Connect())
{
  SqlCommand cmd = new SqlCommand();
  cmd.Connection = connection;
  cmd.CommandText = cmdText;
  cmd.CommandType = type;
  if (param.Length > 0)
  {
  foreach (SqlParameter p in param)
  {
  cmd.Parameters.Add(p);
  }
  }
  connection.Open();
}
这样就不用担心会遗漏释放资源了

#9


首先,写个日志记录方法来记录详细的抱错信息,在每个catch里调用。看看是哪个地方的catch

#10


下面是以前我遇到过的错误,也是程序运行一段时间后才出现的,是因为没有及时关闭数据库连接。

超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。