同样的代码,数据库不同,出现了这个错误
在sqlserver中:
public static SqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connString);
try {
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}catch {
conn.Close();
throw;
}
}
没有错误,但是到了ACCESS中
public static OleDbDataReader ExecuteReader(string connection,string cmdText,params OleDbParameter[] cmdParms)
{
OleDbCommand cmd=new OleDbCommand();
OleDbConnection conn=new OleDbConnection(connection);
try
{
PrepareCommand(cmd,conn,cmdText,cmdParms);
OleDbDataReader rdr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch{
conn.Close();
throw;
}
}
却出现OleDbCommand 是当前正忙的Open, Fetching,把cmd.Parameters.clear()注释掉就没错误了,
OleDbDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
这里把connection保持了
所以在调用cmd.Parameters.Clear();才会出错
去掉cmd.Parameters.Clear();,不用清空
系统会自己释放的
上面我们使用的是CommandBehavior.CloseConnection,作用是关闭DataReader的时候自动关闭对应的ConnectionObject。这样可以避免我们忘记关闭DataReader对象以后关闭Connection对象,另外CommandBehavior.SingleRow可以使结果集返回单个行,CommandBehavior.SingleResult返回结果为多个结果集的第一个结果集。当然Commandbehavior枚举还有其他值,请参见msdn.