none
关于ExecuteReader与ExecuteReader(CommandBehavior.CloseConnection)遇到无数据返回时出现的错误!help!!! RRS feed

  • 问题

  • public  SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
            {
                connection = new SqlConnection(connectionString);
                SqlCommand comm = new SqlCommand();
                OpenConnection();
                try
                {
                    PrepareCommand(connection, comm, cmdType, cmdText, commandParameters);//对sqlcommand属性进行填充
                    SqlDataReader sdr = comm.ExecuteReader(CommandBehavior.CloseConnection);
                    comm.Parameters.Clear();//清除参数
                    return sdr;
                }
                catch
                {
                    CloseConnection();
                    throw;
                }
            }
    当查询结果为空的时候就会报错,该怎么解决呢?请诸位指导小菜……
    是comm.ExecuteReader(CommandBehavior.CloseConnection)因为读不到数据连接关闭,然后sdr是null。
    报错陈述为:
    未处理 System.InvalidOperationException
      Message="ExecuteReader requires an open and available Connection. The connection's current state is closed."
     该怎么解决呢?
    另外netpetshop也是这么写的呀?他是怎样处理没有出现错误的?
    2011年3月11日 11:57

答案

  • Welcome!

    错误的原因在于connection,你把connection声明成了全局的变量!

     public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
          SqlCommand cmd = new SqlCommand();
          SqlConnection conn = new SqlConnection(connectionString);
    
          // we use a try/catch here because if the method throws an exception we want to 
          // close the connection throw code, because no datareader will exist, hence the 
          // commandBehaviour.CloseConnection will not work
          try {
            PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return rdr;
          }
          catch {
            conn.Close();
            throw;
          }
        }
    

    请看下代码的不同之处~


    Alan Chen[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Tonny Gu 2011年3月17日 2:30
    2011年3月14日 2:52
    版主

全部回复

  • Welcome!

    错误的原因在于connection,你把connection声明成了全局的变量!

     public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
          SqlCommand cmd = new SqlCommand();
          SqlConnection conn = new SqlConnection(connectionString);
    
          // we use a try/catch here because if the method throws an exception we want to 
          // close the connection throw code, because no datareader will exist, hence the 
          // commandBehaviour.CloseConnection will not work
          try {
            PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return rdr;
          }
          catch {
            conn.Close();
            throw;
          }
        }
    

    请看下代码的不同之处~


    Alan Chen[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Tonny Gu 2011年3月17日 2:30
    2011年3月14日 2:52
    版主
  • Dear Alan_chen

                我重新写了下,全部用了静态方法,就可以了。这是为什么呢?想不明白呀。

                


    2011年3月17日 2:11
  • Alan_chen

                 可以给我你的邮件或是其他的联系方式么?我的邮箱:ssrivers.studio@gmail.com

    • 已编辑 Tonny Gu 2011年3月17日 2:46 打错字
    2011年3月17日 2:14
  • Hi ssrivers,

    静态方法是属于这个类所以的,不需要用实例去调用这个方法~

    当然可以:v-alache@microsoft.com

     


    Alan Chen[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月17日 4:18
    版主
  • Dear Alan:

          谢谢你的帮助,但是我还是不太明白,我的出错原因是什么呢?我以前觉得是因为Datareader读不到数据立马关闭连接,从而无法返回datareader。如果这么理解的话就算是静态方法也同样会遇到这样的问题啊。是connection是全局的原因,还是返回值是静态的原因呢?是不是因为是静态方法所以他一定能返回Datareader呢?

    2011年3月17日 7:31
  • 返回值只跟方法的Type有关,如果是void就不返回。你的具体的原因需要debug一下,你设置断点,然后按F5---->F10一步一步的调试,去看里面的值,是否正确~

     


    Alan Chen[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月17日 7:37
    版主