请高手帮分析一下,这个类可以正确释放资源吗?
有什么不合理的地方,需要怎么优化?请大家不吝赐教。谢谢。
mysql for C#数据源驱动
第一步:请引用此压缩包中的MySql.Data.dll. 放在(bin)目录中
第二步:web.config 中的连接字符串:
<add key="mysqlconn" value="server=IP地址;database=数据库名;uid=登陆帐号;pwd=登陆密码;"></add>
第三步:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using MySql.Data.Types;
using MySql.Data.MySqlClient;
/// <summary>
/// C#操作mysql基类
/// </summary>
public class MySqlobj
{
    private MySqlConnection conn;
    private MySqlCommand com;
    private bool _alreadyDispose = false;
    #region 构造与柝构
    public MySqlobj()
    {
        try
        {
            conn = new MySqlConnection(ConfigurationManager.AppSettings["mysqlconn"]);
            conn.Open();
            com = new MySqlCommand();
            com.Connection = conn;
        }
        catch (Exception ee)
        {
            throw new Exception("连接数据库出错");
        }
    }
    ~MySqlobj()
    {
        Dispose();
    }
    protected virtual void Dispose(bool isDisposing)
    {
        if (_alreadyDispose) return;
        if (isDisposing)
        {
            // TODO: 此处释放受控资源 
            if (com != null)
            {
                
                com.Dispose();
            }
            if (conn != null)
            {
                try
                {
                    conn.Close();
                    conn.Dispose();
                }
                catch (Exception ee)
                {
                }
                finally
                {
                    conn = null;
                }
            }
        }
        // TODO: 此处释放非受控资源。设置被处理过标记 
        _alreadyDispose = true;
    }
    #endregion
    #region IDisposable 成员
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    #endregion
    #region 获取DataSet
    public DataSet GetDataSet(string sqlString)
    {
        DataSet ds = new DataSet();
        try
        {
            MySqlDataAdapter da = new MySqlDataAdapter(sqlString, conn);
            da.Fill(ds);
        }
        catch (Exception ee)
        {
            throw new Exception("SQL:" + sqlString + "<br />" + ee.Message.ToString());
        }
        return ds;
    }
    #endregion
    #region 执行插入或删除操作
    public void ExecuteNonQuery(string sqlString)
    {
        int ret = 0;
        com.CommandText = sqlString;
        com.CommandType = CommandType.Text;
        try
        {
            ret = com.ExecuteNonQuery();
        }
        catch (Exception ee)
        {
            throw new Exception("SQL:" + sqlString + "<br />" + ee.Message.ToString());
        }
        finally
        {
            com.Dispose();
        }
    }
    #endregion数据库数据库操作类mysql

解决方案 »

  1.   

    使用的时候:MySqlobj mso = new MySqlobj();
    -----
    string sqlStr="select ***";
    DataSet ds = mso.GetDataSetsqlStr);
    ------
    mso.ExecuteNonQuery(login_log);
    ------
    这样使用的
      

  2.   

    不要用析构函数,请改为继承IDispose接口,这不是C++,析构函数何时会被调用很不确定。单独提供一个数据库连接打开的方法,不要在构造函数里打开链接。每个方法都必须带一个参数,类型为MySqlConnection,由外部传入连接对象,是否为打开状态,是否启用了事务,都有外部控制。
      

  3.   

    在操作类中,凡是捕获到异常,都转到一个专门的方法里去处理,处理的内容最简单的就是Dispose掉数据连接(继承IDispose接口)等对象,然后重新抛出异常。