{
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