IDisposable模式

本文介绍了IDisposable模式的应用及其实现方式,并通过一个具体的事务控制类实例展示了如何使用该模式来确保资源得到正确释放。
  IDisposable模式不是经典的GOF模式之一,主要是实现IDisposable接口,这在.Net Framework中很常见,当用using语句时,实现这个接口的类在释放资源时自动释放。例如我们在开发中经常用到事务控制,这时我们写一个事务控制类,让它继承IDisposable接口。
using System;
using System.Data;

public class TransactionControl : IDispoable
{
    
private bool _disposed = false;
    
private IDbConnection _conn;
    
private IDbTransaction _trans;

    
public TransactionControl()
    {
        
try
        {
            _conn 
= ConnFactory.Create(ConnManager.GetConnInfo());
            _conn.Open();
            _trans 
= _conn.BeginTransaction();
        }
        
catch
        {
            Dispose();
        }
    }

    
public TransactionControl(string name)
    {
        
try
        {
            _conn 
= ConnFactory.Create(ConnManager.GetConnInfoByName(name));
            _conn.Open();
            _trans 
= _conn.BeginTransaction();
        }
        
catch
        {
            Dispose();
        }
    }

    
public void Commit()
    {
        _trans.Commit();
    }

    
public void Rollback()
    {
        _trans.Rollback();
    }

    
public IDbConnection Connection
    {
        
get { return _conn; }
    }

    
public IDbTransaction Transaction
    {
        
get { return _trans; }
    }

    
~DisposeObject()
    {
        Dispose(
false);
    }

    
public void Dispose()
    {
        Dispose(
true);
    }

    
private void Dispose(bool disposing)
    {
        
if (!_disposed)
        {
            
if (disposing)
            {
                CleanUp();
                GC.SuppressFinalize(
this);
            }
            _disposed 
= true;
        }
    }

    
private void CleanUp()
    {
        
if (_trans != null)
        {
            _trans.Dispose();
        }
        
if (_conn != null)
        {
            
if (_conn.State != ConnectionState.Closed)
            {
                _conn.Close();
            }
            _conn.Dispose();
        }
    }
}

转载于:https://www.cnblogs.com/8user/archive/2008/11/08/1329440.html

报错:Dao4.Dao40(+ 1重载) "Dao4":using语句中使用的类型必须可隐式转换为”System.IDisposable" using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _2 { class Dao4 { private readonly string _conn; // 公共属性暴露连接对象 public SqlConnection Connection { get; private set; } // 构造函数1:从配置文件获取连接字符串 public Dao4() { if (string.IsNullOrEmpty(_conn)) { // 默认连接字符串(仅用于开发环境) _conn = "Server=LAPTOP-265KA3NF;Database=pointnote;Integrated Security=True;"; } } // 构造函数2:允许传入自定义连接字符串 public Dao4(string connectionString) { if (string.IsNullOrWhiteSpace(connectionString)) throw new ArgumentException("连接字符串不能为空", nameof(connectionString)); _conn = connectionString; } public void Connect() { // 实际项目中应从配置读取连接字符串 Connection = new SqlConnection(_conn); Connection.Open(); } public int ExecuteParameterized(string sql, List<SqlParameter> parameters) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { // 添加所有参数 cmd.Parameters.AddRange(parameters.ToArray()); // 执行并返回受影响行数 return cmd.ExecuteNonQuery(); } } // 增加一个方法用于执行查询并返回SqlDataReader public SqlDataReader Read(string sql) { SqlCommand cmd = new SqlCommand(sql, Connection); return cmd.ExecuteReader(); } // 关闭连接的方法(可选) public void Disconnect() { if (Connection != null && Connection.State != ConnectionState.Closed) { Connection.Close(); } } // 添加 Close 方法 public void Close() { if (Connection != null && Connection.State != ConnectionState.Closed) { Connection.Close(); Connection = null; } } // 实现 IDisposable 模式 public void Dispose() { Close(); GC.SuppressFinalize(this); } internal int Execute(string sql) { int rowsAffected = 0; try { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { rowsAffected = cmd.ExecuteNonQuery(); } } catch (SqlException ex) { // 记录日志或进行其他异常处理操作 Console.WriteLine($"执行SQL语句时发生错误:{ex.Message}"); } return rowsAffected; } } } 怎么改
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值