SqlHelper中的cmd.Parameters.Clear()
来源:互联网 发布:java ssh框架 编辑:程序博客网 时间:2024/06/07 09:51
Pet Shop 游记之DBUtility 一 (SqlHelper中的cmd.Parameters.Clear())
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"));
- 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
- 深入研究java.lang.ThreadLocal类
- Qt创建文件夹
- 钩子
- .unity3d格式的导出与加载
- ubuntu11.04安装virtualbox4.0.12并识别USB
- SqlHelper中的cmd.Parameters.Clear()
- 推荐25个提高网站可用性和转化率的工具
- jni 类型转换
- Windows异常处理
- STL vector的erase操作问题
- JavaScript 图片滚动(绝对酷)
- 【转】16GB大内存该怎么玩儿?
- 创建第一个IOS程序 Hello World
- 安装cygwin