看到一段代码,好象是处理数据库连接及其它工作的类:
public class Database : IDisposable {
// 连接数据源
private SqlConnection con;

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName) {
SqlCommand cmd = CreateCommand(procName, null);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters["ReturnValue"].Value;
}不清楚 : IDisposable 这个是个什么东东?

解决方案 »

  1.   

    继承IDisposable这个接口,至于这是啥msdn查一下
      

  2.   

    IDisposable 接口 
    定义一种释放分配的非托管资源的方法。 代码是否没有贴全呢?在继承了该接口后 应该显示的实现dispose方法才对嘛
      

  3.   

    public class Database : IDisposable {
    // 连接数据源
    private SqlConnection con;

    /// <summary>
    /// 执行存储过程
    /// </summary>
    /// <param name="procName">存储过程的名称</param>
    /// <returns>返回存储过程返回值</returns>
    public int RunProc(string procName) {
    SqlCommand cmd = CreateCommand(procName, null);
    cmd.ExecuteNonQuery();
    this.Close();
    return (int)cmd.Parameters["ReturnValue"].Value;
    } /// <summary>
    /// 执行存储过程
    /// </summary>
    /// <param name="procName">存储过程名称</param>
    /// <param name="prams">存储过程所需参数</param>
    /// <returns>返回存储过程返回值</returns>
    public int RunProc(string procName, SqlParameter[] prams) {
    SqlCommand cmd = CreateCommand(procName, prams);
    cmd.ExecuteNonQuery();
    this.Close();
    return (int)cmd.Parameters["ReturnValue"].Value;
    } /// <summary>
    /// 执行存储过程
    /// </summary>
    /// <param name="procName">存储过程的名称</param>
    /// <param name="dataReader">返回存储过程返回值</param>
    public void RunProc(string procName, out SqlDataReader dataReader) {
    SqlCommand cmd = CreateCommand(procName, null);
    dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    //return (int)cmd.Parameters["ReturnValue"].Value;
    } /// <summary>
    /// 执行存储过程
    /// </summary>
    /// <param name="procName">存储过程的名称</param>
    /// <param name="prams">存储过程所需参数</param>
    /// <param name="dataReader">存储过程所需参数</param>
    public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader) {
    SqlCommand cmd = CreateCommand(procName, prams);
    dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    //return (int)cmd.Parameters["ReturnValue"].Value;
    }

    /// <summary>
    /// 创建一个SqlCommand对象以此来执行存储过程
    /// </summary>
    /// <param name="procName">存储过程的名称</param>
    /// <param name="prams">存储过程所需参数</param>
    /// <returns>返回SqlCommand对象</returns>
    private SqlCommand CreateCommand(string procName, SqlParameter[] prams) {
    // 确认打开连接
    Open();
    SqlCommand cmd = new SqlCommand(procName, con);
    cmd.CommandType = CommandType.StoredProcedure; // 依次把参数传入存储过程
    if (prams != null) {
    foreach (SqlParameter parameter in prams)
    cmd.Parameters.Add(parameter);
    }

    // 加入返回参数
    cmd.Parameters.Add(
    new SqlParameter("ReturnValue", SqlDbType.Int, 4,
    ParameterDirection.ReturnValue, false, 0, 0,
    string.Empty, DataRowVersion.Default, null)); return cmd;
    } /// <summary>
    /// 打开数据库连接.
    /// </summary>
    private void Open() {
    // 打开数据库连接
    if (con == null) {
    con = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
    }
    if(con.State ==System.Data.ConnectionState.Closed)
    con.Open(); } /// <summary>
    /// 关闭数据库连接
    /// </summary>
    public void Close() {
    if (con != null)
    con.Close();
    } /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose() {
    // 确认连接是否已经关闭
    if (con != null) {
    con.Dispose();
    con = null;
    }
    } /// <summary>
    /// 传入输入参数
    /// </summary>
    /// <param name="ParamName">存储过程名称</param>
    /// <param name="DbType">参数类型</param></param>
    /// <param name="Size">参数大小</param>
    /// <param name="Value">参数值</param>
    /// <returns>新的 parameter 对象</returns>
    public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value) {
    return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
    } /// <summary>
    /// 传入返回值参数
    /// </summary>
    /// <param name="ParamName">存储过程名称</param>
    /// <param name="DbType">参数类型</param>
    /// <param name="Size">参数大小</param>
    /// <returns>新的 parameter 对象</returns>
    public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size) {
    return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
    } /// <summary>
    /// 传入返回值参数
    /// </summary>
    /// <param name="ParamName">存储过程名称</param>
    /// <param name="DbType">参数类型</param>
    /// <param name="Size">参数大小</param>
    /// <returns>新的 parameter 对象</returns>
    public SqlParameter MakeReturnParam(string ParamName, SqlDbType DbType, int Size) 
    {
    return MakeParam(ParamName, DbType, Size, ParameterDirection.ReturnValue, null);
    }

    /// <summary>
    /// 生成存储过程参数
    /// </summary>
    /// <param name="ParamName">存储过程名称</param>
    /// <param name="DbType">参数类型</param>
    /// <param name="Size">参数大小</param>
    /// <param name="Direction">参数方向</param>
    /// <param name="Value">参数值</param>
    /// <returns>新的 parameter 对象</returns>
    public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value) {
    SqlParameter param; if(Size > 0)
    param = new SqlParameter(ParamName, DbType, Size);
    else
    param = new SqlParameter(ParamName, DbType); param.Direction = Direction;
    if (!(Direction == ParameterDirection.Output && Value == null))
    param.Value = Value; return param;
    }
    }
      

  4.   

    IDisposable 接口 
    定义一种释放分配的非托管资源的方法。
      

  5.   

    继承了一个.netfreamwork内置的接口而已和继承自己定义的接口 没什么区别继承IDisposable 就是用来及时释放资源的 而不必等到GC自动回收才释放资源
      

  6.   

    继承了一个.netfreamwork内置的接口而已和继承自己定义的接口 没什么区别继承IDisposable 就是用来及时释放资源的 而不必等到GC自动回收才释放资源
    ------------------------------------------------
    其实也就是可继承IDisposable也可不用的,是不是就这样理解?
      

  7.   

    实现这个接口是为了给使用者一个能手动释放对象的机会
    例如
    object a = ... 
    //你如何在下一句释放它
    a = null ?? //不能确定,只能等待gc来收拾
    如果 a 实现了idisposeable
    则可
    a.dispose();//即可尤其是a 里如果包括一个非托管资源,比如数据库联接,文件句柄等不受框架管理的东东时,尤其重要
    还有实现了这个接口,你可以用
    using( youclass a = new yourclass )
    {
    }//到这里a 已经自动释放