用这个类访问mysql,多刷新查询几次就连不上mysql数据库服务器了,必须IIS重启或回收应用程序池才能连上。
 有没有好的解决方案?
 微软对Oracel,sql server等数据库支持相当的好,是对mysql支持不好吗?
using System; 
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Text; 
using System.Data; 
using MySql.Data.MySqlClient; 
using System.IO;namespace Maticsoft.DBUtility
{
    public class MySqlHelper
    {
        private MySqlConnection myConnection;
        private MySqlCommand myCommand;
        private MySqlDataAdapter myAdapter;
        private MySqlTransaction myTransaction;        public MySqlHelper()
        {
            getConnection();
        }        //建立DB连接 
        public void getConnection()
        {
            //StreamReader din = File.OpenText("TextFile.ini");
            //string contString = din.ReadLine();
            string contString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringMySql"].ConnectionString;            try
            {
                myConnection = new MySqlConnection();
                myConnection.ConnectionString = contString;
                myConnection.Open();            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex); 
                throw new Exception("连接失败!");
            }
        }
        private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
        {            if (conn.State != ConnectionState.Open)
                conn.Open();            cmd.Connection = conn;
            cmd.CommandText = cmdText;            cmd.CommandType = cmdType;            if (cmdParms != null)
            {
                foreach (MySqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }        private static MySqlCommand buildQueryCommand(MySqlConnection connection, string storedProcName,
                                            IDataParameter[] parameters)
        {
            var command = new MySqlCommand(storedProcName, connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = 60 };
            foreach (MySqlParameter parameter in parameters)
            {
                if (parameter == null)
                {
                    continue;
                }
                if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                    (parameter.Value == null))
                {
                    parameter.Value = DBNull.Value;
                }
                command.Parameters.Add(parameter);
            }            return command;
        }     
        //数据查询操作 
        public DataTable executeQuery(String sql)
        {
            DataTable myTable;
            try
            {
                myCommand = myConnection.CreateCommand();
                myCommand.CommandText = sql;
                myAdapter = new MySqlDataAdapter(myCommand);
                DataSet mySet = new DataSet();
                myAdapter.Fill(mySet, "selectDa");
                myTable = mySet.Tables["selectDa"];
                return myTable;
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex); 
                myTable = new DataTable();
                throw new Exception("数据发生错误!");
                return myTable;
            }
        }        //数据插入,删除,更新操作 
        public Boolean executeUpdate(String sql)
        {
            try
            {
                myCommand = myConnection.CreateCommand();
                myCommand.CommandText = sql;
                myCommand.ExecuteNonQuery();
                if (myTransaction == null)
                {
                    myConnection.Close();
                    myConnection = null;
                }
                return true;
            }
            catch (Exception ex)
            {
                if (myTransaction != null)
                {
                    myTransaction.Rollback();
                    myTransaction = null;
                    throw new Exception("数据发生错误,正在启用事务回滚!");
                }
                else if (myConnection == null)
                {
                    throw new Exception("请启用事务!");
                }
                else
                {
                    throw new Exception("发生错误!");
                }
                Console.WriteLine(ex);
                return false;
            }
        }
        public MySqlDataReader ExecuteReader(String sql, params MySqlParameter[] commandParameters)
        {
            return ExecuteReader(myConnection, CommandType.Text, sql, commandParameters);
        }        public MySqlDataReader ExecuteReader(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
            MySqlDataReader rdr = null;
            try
            {
                rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (MySqlException e)
            {
                conn.Close();
                conn.Dispose();                throw e;
            }
            cmd.Parameters.Clear();            return rdr;
        }
        public object ExecuteScalar(String sql, params MySqlParameter[] commandParameters)
        {
            return ExecuteScalar(myConnection, CommandType.Text, sql, commandParameters);
        }
        public object ExecuteScalar(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            object val;
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
            try
            {
                val = cmd.ExecuteScalar();
            }
            catch (MySqlException e)
            {
                conn.Close();
                conn.Dispose();
                throw e;
            }
            cmd.Parameters.Clear();
            return val;
        }        /// <param name="sql">命令语句</param>
        /// <param name="commandParameters">命令的参数</param>
        /// <returns>一个须转换成其它类型的值</returns>
        public bool ExecuteNonQuery(string sql, params MySqlParameter[] commandParameters)
        {
            return ExecuteNonQuery(myConnection, CommandType.Text, sql, commandParameters);
        }
        public bool ExecuteNonQuery(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            int effectRows = 0;
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
            try
            {
                effectRows = cmd.ExecuteNonQuery();
            }
            catch (MySqlException e)
            {
                conn.Close();
                conn.Dispose();
                throw e;
            }
            cmd.Parameters.Clear();
            return effectRows > 0;
        }        public DataSet Query(string sqlString)
        {
            return Query(sqlString, new MySqlParameter[] { });
        }        /// <param name="sql">SQL语句</param>
        /// <param name="cmdParms">MySqlCommand参数数组(可为null值)</param>
        /// <returns></returns>
        public DataSet Query(string sql, params MySqlParameter[] cmdParms)
        {
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, myConnection, CommandType.Text, sql, cmdParms);
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            myConnection.Close();
            cmd.Parameters.Clear();
            return ds;        }
        public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
        {
            var dataSet = new DataSet();
            myConnection.Open();
            var sqlDa = new MySqlDataAdapter
            {
                SelectCommand = buildQueryCommand(myConnection, storedProcName, parameters)
            };
            sqlDa.Fill(dataSet, tableName);
            myConnection.Close();
            return dataSet;
        }        //创建事务 
        public void createTransaction()
        {
            try
            {
                myTransaction = myConnection.BeginTransaction();
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex); 
                throw new Exception("启用事务失败!");
            }
        }
        //提交事务 
        public void commitTransaction()
        {
            try
            {
                if (myTransaction != null) myTransaction.Commit();            }
            catch (Exception ex)
            {
                myTransaction.Rollback();
                Console.WriteLine(ex);
                throw new Exception("数据发生错误,正在启用事务回滚!");
            }
            finally
            {
                myConnection.Close();
                myConnection = null;
            }
        }
    }
}

解决方案 »

  1.   

    没用MySql连过.NET
    连接Java很好
      

  2.   

    connection 没关闭。使用using 或者在finally 写dispose()。
      

  3.   

    这个MySqlHelper类写得实在不咋样
     自己改了下,好像现在没问题了。
     使用try,catch
     把关闭连接的都写finally里面
    finally
                 {
                     conn.Close();
                     conn.Dispose();
                 }
      

  4.   

    正准备学.net+mysql,结果看到这里被吓住了,
    总结一句:写程序不能只为写程序而写程序,更应该往性能上考虑
    要想写出好的程序,就必须有好的代码规范、架构设计