private OleDbDataReader GetData(string SqlStr_)
        {
            OleDbCommand command = new OleDbCommand(SqlStr_, conn);
            OleDbDataReader reader = null;
            try
            {
                reader = command.ExecuteReader();
                return reader;
            }
            catch (System.Exception ex)
            {
                return null;
            }           
        }
多次调用访问数据库读取数据会产生异常崩溃,reader会为空,但是数据库不为空。求高手指点!

解决方案 »

  1.   

    ExecuteReader只读取一条数据,你应该用adapter的fill填充datatable
      

  2.   

    感谢bdmh指点,不过没有明白,麻烦详细点说,最好给点代码,我比较初级,多谢!
      

  3.   

    DataReader是一个前向只读的数据读取器,并且每次使用完后需要关闭掉。你的这种情况,建议使用返回一个DataSet处理
    private DataSet GetData(string SqlStr_)
    {
      DataSet ds = new DataSet();
      OleDbDataAdapter da = new OleDbDataAdapter(SqlStr_, conn);
      try
      {
          da.Fill(ds);
      }
      catch (System.Exception ex)
      {
          ds = null;
      }   
      return ds;
    }
      

  4.   

    DataReader是一个前向只读的数据读取器,并且每次使用完后需要关闭掉。所以我们经常在读取数据 然后填充到实体类中用到
    比如:
    using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionString, CommandType.StoredProcedure, "PageView", parms))
     {
        while (rdr.Read())
        {
          //dosomething 填充实体                              
        }                           
    }
      

  5.   

    感谢暖枫无敌和sibiyellow的回答,但是我这个是一个数据表存储的是二进制图片文件,我要调用读取。
    string sql = string.Format("select tx from DeviceKind where id={0}", DeviceKind_id);
                OleDbDataReader dr = GetData(sql);
                if (dr == null) 
                {
                    return;
                }
                if (dr.Read())
                {
                    object image_ = dr.GetValue(0);
                    if (image_==DBNull.Value)
                    {
                        pictureBox1.Image = null;
                        return;
                    }
                    byte[] mydata = (byte[])image_;
                    Stream myStream = new MemoryStream(mydata);
                    try
                    {
                        pictureBox1.Image = Image.FromStream(myStream);
                    }
                    catch (System.Exception ex)
                    {                   
                    }
                    myStream.Dispose();
                    myStream.Close();
                    pictureBox1.Refresh();
                }
                dr.Close();
    这里对应怎么实现啊?请指教
      

  6.   

    你只是取该字段名称而已,用什么无所谓,给你改写如下:
    public DataSet GetData(string SqlStr_)
    {
      DataSet ds = new DataSet();
      OleDbDataAdapter da = new OleDbDataAdapter(SqlStr_, conn);
      try
      {
          da.Fill(ds);
      }
      catch (System.Exception ex)
      {
          ds = null;
      }   
      return ds;
    }
    string sql = string.Format("select tx from DeviceKind where id={0}", DeviceKind_id);
    DataSet ds = GetData(sql);
    if (dr == null)  
    {
        return;
    }
    else
    {
      object image_ = ds.Tables[0].Rows[0][0];
      if (image_==DBNull.Value)
      {
         pictureBox1.Image = null;
         return;
      }
      byte[] mydata = (byte[])image_;
      Stream myStream = new MemoryStream(mydata);
      try
      {
        pictureBox1.Image = Image.FromStream(myStream);
      }
      catch (System.Exception ex)
      { 
      }
      myStream.Dispose();
      myStream.Close();
      pictureBox1.Refresh();
    }
      

  7.   


    刚刚试了,发现问题并不是出在这里。
    public DataSet GetData(string SqlStr_)
    {
      DataSet ds = new DataSet();
      OleDbDataAdapter da = new OleDbDataAdapter(SqlStr_, conn);
      try
      {
          da.Fill(ds);
      }
      catch (System.Exception ex)
      {
          ds = null;
      }   
      return ds;
    }
    错误出现在上面的catch里跟原来用的private OleDbDataReader GetData(string SqlStr_)问题一样,读取为空。请问是什么原因?求指教!
      

  8.   

    你每次调用数据库前要先关掉数据库连接再重新打开  建议在 前面加个if (conn.State == ConnectionState.Opened){conn.Close();}  试试
    或者没有执行SQLcommand.ExecuteNonQuery();//添加这里 执行SQL语句
    reader = command.ExecuteReader();
      

  9.   


    刚又调试了一下,发现问题出在OleDbCommand command = new OleDbCommand(SqlStr_, conn);这一句。
    错误显示为:command参数无效