SqlHelper中的cmd.Parameters.Clear()

Pet Shop 游记之DBUtility 一 (SqlHelper中的cmd.Parameters.Clear())

今天是进入Pet Shop的第一天,第一站名称PetShop.DBUtility.SqlHelper的类,说实话,这是一个很普通的类,除了cmd.Parameter.Clear()之外。先来看看PetShop.DBUtility.SqlHelper中的两个方法吧:

 

public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

{

    SqlCommand cmd = new SqlCommand();

    using (SqlConnection conn = new SqlConnection(connectionString))

    {
        PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
        int val = cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
        return val;
    }
}

 

private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {

    if (conn.State != ConnectionState.Open)
        conn.Open();

    cmd.Connection = conn;
    cmd.CommandText = cmdText;

    if (trans != null)
        cmd.Transaction = trans;

    cmd.CommandType = cmdType;

    if (cmdParms != null) {
        foreach (SqlParameter parm in cmdParms)
            cmd.Parameters.Add(parm);
    }
}

 

  乍看之下cmd.Parameters.Clear() 语句似乎有此多于,因为执行完cmd.Parameters.Clear()语句后就是return语句了,这意味着cmd将成为垃圾回收器的回收对象,如果说是想及时释放资源的话那似乎不通,这个并不占用资源的对象都需要手动清理那要“托管”何用?于是到论坛上发贴请教。得到的答案很失望,有的说是编程习惯,有的解释Clear()是清零。于是Buidu一下,也有人问同样的问题,但结果一样令人失望。看来只能自己解决了,当我看到cmd.Parameters.Add(parm)时发现cmd.Parameters是SqlParameterColeection类型的,而SqlParameterColeection在framework中有个怪脾气,“它不用别人用过的”,说得明白点就是:如果一个对象A被一个SqlParameterColeection引用后,此时有另一个SqlParameterColeection再引用A对象时就会发生异常(注意,SqlParameterColeection允许其它类型引用自己引用的对象,比如SqlParameter引用它所引用的对象也不会有问题,只要不是SqlParameterColeection就行)。这样就明天了。我们先删除cmd.Parameters.Clear()语句,然后下面的方面调用ExecuteNonQuery():

 

string conn = "...";//连接字符串

string sqlInsert = "INSERT INTO Cart ( Name,) VALUES ( @Name);";

string sqlSelect = "SELECT * FROM Cart WHERE UniqueID=@UniqueID;";

 

SqlParameter parms = new SqlParameter("@Name", "testUser");

 

ExecuteNonQuery(conn, CommandType.Text, sqlInsert, parms);

ExecuteNonQuery(conn, CommandType.Text, sqlSelect, parms);

 

大家知道每次调用ExecuteNonQuery方法时它都会调用PrepareCommand方法,而PrepareCommand方法执行如下语句:

 

cmd.Parameters.Add(parm);//添加parm的引用到类型为SqlParameterCollection的Parameters对象中

当第一次调用ExecuteNonQuery时会有一个SqlParameterCollection引用parms,注意,这时第一次ExecuteNonQuery调用时产生的cmd还未被垃圾回收器回收,它依然引用着parms,直到真正被回收后,当第二次调用ExecuteNonQuery又会有另一个SqlParameterCollection(cmd.Parameters)将去引用parms,这样就会抛出异常了!!!

 

当添加cmd.Parameters.Clear()后,再调用ExecuteNonQuery即将结果时引用parms的cmd.Parameters就解除了对parms的引用,引用?对!cmd.Parameters.Clear()语句确切的说是解除它对其它对象的引用,而不是清除它包含的对象,cmd.Parameters.Clear()解除对象引用后,它之前引用的对象还是存在的。所以无论ExecuteNonQuery被多次执行都不会有异常。当然,如果不加cmd.Parameters.Clear()语句也可以,那么上面的代码应该这样写:

 

ExecuteNonQuery(conn, CommandType.Text, sqlInsert, new SqlParameter("@Name", "testUser"));

ExecuteNonQuery(conn, CommandType.Text, sqlSelect, new SqlParameter("@Name", "testUser"));


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Helpersqlhelper.cs)是一个用于简化数据库操作的工具类,通常是针对SQL语言进行封装的一个辅助类。它提供了一些常用的数据库操作方法,使得开发人员能够更加方便地与数据库进行交互。 在sqlhelper.cs,可能包含以下几个主要的功能: 1. 连接数据库:sqlhelper.cs可能会提供与数据库建立连接的方法,可以使用连接字符串来指定数据库的位置和相关参数。通过调用这个方法,我们可以实现与数据库的连接,进而进行操作。 2. 执行SQL语句:sqlhelper.cs的方法可以执行各种类型的SQL语句,包括查询语句(SELECT)、插入语句(INSERT)、更新语句(UPDATE)和删除语句(DELETE)。这些方法会根据传入的SQL语句进行相应的操作,并返回操作结果。 3. 参数化查询:为了避免SQL注入等安全问题,sqlhelper.cs可能提供参数化查询的方法。通过将查询条件作为参数传入方法,可以有效地防止恶意输入对数据库的破坏。 4. 事务处理:sqlhelper.cs还可以提供事务处理的相关方法。事务是为了保证数据库操作的一致性和完整性而进行的一系列操作的集合。通过使用sqlhelper.cs提供的事务处理方法,可以确保一系列相关的数据库操作要么全部成功执行,要么全部失败回滚。 5. 错误处理:sqlhelper.cs可能还包含一些错误处理的方法,用于捕捉数据库操作过程可能发生的异常。通过这些方法,可以及时捕获并处理数据库操作的错误,保证系统的稳定性和安全性。 总的来说,sqlhelper.cs是一个封装了常用数据库操作的工具类,可以使开发人员更加方便地进行数据库操作。它可以提供连接数据库、执行SQL语句、参数化查询、事务处理和错误处理等功能,为我们的开发工作提供了方便和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值