none
寻求sqldatareader读不到数据报错的解决方法 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也是这么写的呀?他是怎样处理没有出现错误的?
    • 已编辑 Tonny Gu 2011年3月11日 11:51 补充说明
    2011年3月11日 10:27

答案

  • datareader不需要依靠connection的

    "查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到您使用 DataReaderRead 方法对它们发出请求。 "

    msdn的解释

    这个原因是因为在执行executereader的时候是关闭连接状态

     

    2011年3月13日 1:26
    版主

全部回复

  • 已知异常类型了 直接用catch就可以处理了 最好用vs查看什么异常类型  catch就可以

    2011年3月12日 10:02
  • 用catch处理是返回一个空的sqldatareader么?因为我是用泛型读取的sqldatareader,然后判断sqldatareader为空返回空的泛型么?

    你知道netpetshop是怎么解决的么?

    2011年3月12日 12:09
  • SqlDataReader读取的时候,Connection不能关闭的,要返回 SqlDataReader,你的连接永远不要关闭,另外,最好返回DataTable等,不受连接关闭的影响
    【孟子E章】
    2011年3月12日 13:54
    版主
  • 我发现SqlDataReader的缺点了。如果这样的话,使用sqldatareader要考虑的方面真的好多。看到好多的例子是用sqldatareader读数,然后用泛型装载,是不是这样就能提高数据的读取性能?

    用泛型装载的时候如果那一列读不到数据又会报错……

     

     using (SqlDataReader sdr = SqlHelper.ExecuteReader(CommandType.StoredProcedure, "usp_getdata_splitpage", paras))

                {

                    while (sdr.Read())

                    {

                        ItemModel itemModel = new ItemModel(sdr.GetString(0), sdr.GetString(1), sdr.GetString(2), sdr.GetString(3), sdr.GetString(4));

                        itemModels.Add(itemModel);

                    }

                }

    用datatable和用泛型来读性能或者其他方面有什么差别呀?

    2011年3月12日 14:07
  • datareader不需要依靠connection的

    "查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到您使用 DataReaderRead 方法对它们发出请求。 "

    msdn的解释

    这个原因是因为在执行executereader的时候是关闭连接状态

     

    2011年3月13日 1:26
    版主