你先在else里加断点,如果执行过else再执行if的话肯定会报错,你else里把reader给关了

解决方案 »

  1.   

    read 之前,判断oleReader的状态,如果是关闭,就打开,再读取;
      

  2.   

    read 之前,判断oleReader的状态,如果是关闭,就打开,再读取;
      

  3.   

    很可能你记录都读完了,然后oleReader.Close,但你循环还在继续
      

  4.   

    感觉逻辑有问题, oleReader.Close(); 不应该放在else里,因为是循环,如果read()==true  不成立,那read 就要关闭??这肯定不正确。下次读的时候 就抛出异常。
     oleReader.Close();  应该放到foreac外边。
      

  5.   

    说的很具体了啊,你for里面的else里面吧reader给关了,下一次再进行循环的时候到了if那里你直接去reader.read()就会抛异常,你在reader.read()前先判断reader是否已经关了,如果关了再打开。
      

  6.   


    reader.read()前先判断reader是否已经关了,如果关了再打开,这个语句怎么写啊
      

  7.   

    因为没有看到你的cmd里面使用了Parameters,所以注释了cmd.Parameters.Clear();,如果需要,请自己取消注释private void DeletePicOnPanel()
    {
    string sql = "SELECT * FROM IDdata";
    string name = SelectedUser.user;
    dbcon.oleConnection1.Open();
    OleDbCommand cmd = new OleDbCommand(sql, dbcon.oleConnection1);
    OleDbDataReader oleReader = cmd.ExecuteReader();
    oleReader.Read(); if (name != null)
    {
    foreach (Control colt in pt_pnl.Controls)
    {
    Button bt = new Button();
    Label le = new Label(); if (oleReader.Read() == true) <<---问题:未处理invalidoperationexception,阅读器关闭时尝试调用Read无效
    {
    string strtmp = (string)oleReader.GetValue(0);
    string ImgPath = "ID/" + strtmp + "/" + strtmp + ".jpg";
    if (bt.Name == name)
    {
    bt.Name = strtmp;
    bt.BackgroundImage = Image.FromFile(ImgPath);
    name = strtmp;
    le.Text = strtmp;
    }
    break;
    }
    else
    {
    bt.BackgroundImage = null;
    bt.Dispose();
    le.Text = "";
    le.Dispose();
    sql = string.Format(@"DELETE FROM IDdata WHERE Name='{0}'", SelectedUser.user);
    cmd.CommandText = sql;
    cmd.ExecuteNonQuery();
    }

    oleReader.Close();
    //cmd.Parameters.Clear();
    }
    }
    else
    {
    MessageBox.Show("请选择用户");
    } dbcon.oleConnection1.Close();
    //cmd.Parameters.Clear();
    cmd.Dispose();
    }
      

  8.   

    你另定义一个OleDbCommand用于负责删除试试,你现在但cmd只用于读。读写(删除)分离,减少数据库打开和关闭的频率,对并发和性能应该也会好些
      

  9.   

    if(reader.IsClose())
    reader.Open();
    应该就这么个意思,具体方法名字可能不大对。
    PS:你这个逻辑本身感觉有问题