OleDbCommand 是当前正忙的Open, Fetching

同样的代码,数据库不同,出现了这个错误

在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.

你可能感兴趣的:(ASP.NET)