{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(Constr))
{
ProCommand(cmd, conn, cmdText, cmdType, cmdParms);
int val = cmd.ExecuteNonQuery();
//cmd.Parameters.Clear();
return val;
}
}
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
cmd.Parameters.AddRange(cmdParms);
}
}
运行连续调用
SqlParameter parms = new SqlParameter("@gname", "testUser");
SQLHelp.ExecuteNonQuery(sqlInsert, CommandType.Text, parms);
SQLHelp.ExecuteNonQuery(sqlSelect, CommandType.Text, parms);
会出错,出错原因
当我看到cmd.Parameters.Add(parm) 时发现cmd.Parameters是SqlParameterColeection类型的,而SqlParameterColeection在framework中有个怪脾气,“它不用别人用过的”,说得明白点就是:如果一个对象A被一个SqlParameterColeection引用后,此时有另一个SqlParameterColeection再引用A对象时就会发生异常。
当第一次调用ExecuteNonQuery时会有一个SqlParameterCollection引用parms,注意,这时第一次ExecuteNonQuery调用时产生的cmd还未被垃圾回收器回收,它依然引用着parms,直到真正被回收后,当第二次调用ExecuteNonQuery又会有另一个SqlParameterCollection(cmd.Parameters)将去引用parms,这样就会抛出异常了!!!
原因是你用到了SqlDataReader,你用DataTable缓存结果集就没问题了,因为当你的SqlDataReader没有关闭之前,那个返回型参数将得不到值,但是你在遍历那个SqlDataReader 之前就清空了Parameters,因此返回值无法回写。看看你的Helper中,有没有执行后得到DataTable或者DataSet的方法,有的话直接用那个就绝对不会有问题的。
解决这个问题、
一、cmd.Parameters.Clear() 增加个cmd实例化后面
public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms) { SqlCommand cmd = new SqlCommand(); cmd.Parameters.Clear(); using (SqlConnection conn = new SqlConnection(Constr)) { ProCommand(cmd, conn, cmdText, cmdType, cmdParms); int val = cmd.ExecuteNonQuery(); //cmd.Parameters.Clear(); return val; } }
二、不用SqlDataReader 读取,用DataTable或者DataSet的方法
参考:http://blog.csdn.net/chenyiying37/article/details/5797090