OleDbCommand 是当前正忙的Open, Fetching

本文探讨了在ADO.NET应用程序中,针对SQL Server和Access两种不同数据库环境下执行读取操作时出现的问题。主要讨论了如何正确处理OleDbCommand在忙状态下的问题,并给出了具体的解决方案。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值