我用.net链接mysql数据库,网站运行一段时间后总是出现Timeout expired错误,从网上查了查说是数据连接用完后没有关闭,可是我怎么找都没有找到哪里没关闭,大家帮帮忙,我把我的MySQLHelper.cs类发上来,大家帮我看看吧,谢了!真的很急!!!
- C# code
using System;using System.Collections;using System.Data;//using System.Data.SqlClient;using MySql.Data.MySqlClient;using System.Collections.Generic;using System.Configuration;namespace DAL{ public static class MySQLHelper { //数据库连接字符串。 //连接字符串在界面层的webConfig的配置文件中。[设计为public是为了创建带事务的连接,因为连接将在DAL相关类中创建] private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["qkzx"].ConnectionString; private static MySqlConnection sqlcon = null; private static MySqlCommand sqlcmd = null; #region 执行SQL语句或存储过程,返回影响的行数 /// <summary> /// 执行SQL语句或存储过程,返回影响的行数 /// </summary> /// <param name="commandType">命令类型(存储过程, 文本, 表或视图)</param> /// <param name="commandText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>执行命令所影响的行数</returns> public static int ExecuteNonQuery(CommandType commandType, string commandText, params MySqlParameter[] commandParameters) { MySqlCommand command = new MySqlCommand(); using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { //为什么要调用准备执行命令这个方法:因为在此处可以加入一个事务控制。 PrepareCommand(command, connection, commandType, commandText, commandParameters); int val = command.ExecuteNonQuery(); command.Parameters.Clear(); return val; } } #endregion #region 执行一个返回读取器的sql命令 /// <summary> /// 用执行的数据库连接执行一个返回读取器的sql命令 /// </summary> /// <param name="commandType">命令类型(存储过程, 文本, 等等)</param> /// <param name="commandText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>包含结果的读取器</returns> public static MySqlDataReader ExecuteGetReader(CommandType commandType, string commandText, params MySqlParameter[] commandParameters) { //创建一个SqlCommand对象 MySqlCommand command = new MySqlCommand(); MySqlConnection connection = new MySqlConnection(ConnectionString); //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在, //因此commandBehaviour.CloseConnection 就不会执行 try { //调用 PrepareCommand 方法,对 SqlCommand 对象设置参数 PrepareCommand(command, connection, commandType, commandText, commandParameters); //调用 SqlCommand 的 ExecuteReader 方法 MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); //清除参数 command.Parameters.Clear(); return reader; //注意不能关闭连接,否则调用方无法读取数据。 } catch { //关闭连接,抛出异常 connection.Close(); throw; } } #endregion #region 执行命令,返回DataTable /// <summary> /// 执行命令,返回DataTable /// </summary> /// <param name="commandText">命令内容</param> /// <param name="commandType">命令类型</param> /// <param name="commandParameters">参数</param> /// <returns>DataTable数据表</returns> public static DataTable ExecuteGetDataTable(CommandType commandType, string commandText, params MySqlParameter[] commandParameters) { MySqlCommand command = new MySqlCommand(); DataTable table = new DataTable(); using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { PrepareCommand(command, connection, commandType, commandText, commandParameters); MySqlDataAdapter adapter = new MySqlDataAdapter(command); adapter.Fill(table); return table; } } #endregion #region 执行一个命令并返回第一列 /// <summary> /// 用指定的数据库连接字符串执行一个命令并返回一个数据集的第一列 /// </summary> ///<param name="ConnectionString">一个有效的连接字符串</param> /// <param name="commandType">命令类型(存储过程, 文本, 等等)</param> /// <param name="commandText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>用 Convert.To{Type}把类型转换为想要的 </returns> public static object ExecuteScalar(CommandType commandType, string commandText, params MySqlParameter[] commandParameters) { MySqlCommand command = new MySqlCommand(); using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { PrepareCommand(command, connection, commandType, commandText, commandParameters); object val = command.ExecuteScalar(); command.Parameters.Clear(); return val; } } #endregion #region 准备执行一个命令 /// <summary> /// 准备执行一个命令 /// </summary> /// <param name="cmd">sql命令</param> /// <param name="conn">Sql连接</param> /// <param name="cmdType">命令类型例如 存储过程或者文本</param> /// <param name="cmdText">命令文本</param> /// <param name="cmdParms">执行命令的参数</param> private static void PrepareCommand(MySqlCommand command, MySqlConnection connection, CommandType commandType, string commandText, MySqlParameter[] commandParameters) { if (connection.State != ConnectionState.Open) { connection.Open(); } command.Connection = connection; command.CommandText = commandText; command.CommandType = commandType; if (commandParameters != null) command.Parameters.AddRange(commandParameters); } #endregion }}