SqlHelper中的cmd.Parameters.Clear()
来源:互联网 发布:c语言printf和scanf 编辑:程序博客网 时间:2024/05/23 00:47
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是SqlParameterCollection类型的,而SqlParameterCollection在framework中有个怪脾气,“它不用别人用过的”,说得明白点就是:如果一个对象A被一个SqlParameterCollection引用后,此时有另一个SqlParameterCollection再引用A对象时就会发生异常(注意,SqlParameterCollection允许其它类型引用自己引用的对象,比如SqlParameter引用它所引用的对象也不会有问题,只要不是SqlParameterCollection就行)。这样就明白了。我们先删除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"));
原文请点击这里。
- SqlHelper中的cmd.Parameters.Clear()
- SqlHelper中的cmd.Parameters.Clear()
- Pet Shop 游记之DBUtility 一 (SqlHelper中的cmd.Parameters.Clear())
- cmd.Parameters.Clear() 语句的作用
- Parameters的clear方法
- cmd.Parameters.Add()的用法
- 传说中的SQLHelper
- VB.net 中的sqlhelper
- vb.net中的SqlHelper
- ado.net中的parameters
- .NET中的Parameters
- Eclipse中的clear
- Clear Case中的-mkbranch
- css中的clear属性
- CSS中的clear属性
- style中的clear:both
- CSS中的clear属性
- style中的clear:both
- 去掉string中的空格
- select 手动输入
- 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
- cvs服务器在ubuntu 10.04 下的安装
- sql优化
- SqlHelper中的cmd.Parameters.Clear()
- boost 解析XML文件,获取子节点的属性值
- Windows Mobile如何获取基站信息(LAC,CellID)
- java进制的转换
- 虚拟机Linux下嵌入式开发环境搭建
- 第十三周【任务四】 设计一个抽象类CSolid,含有两个求表面积及体积的纯虚函数
- Android开发之旅:应用程序基础及组件
- 理解数据结构和抽象数据类型
- 华为面试题目解答