在程序中加入oleDbDataAdapter(oleDBA),两个DataGridView(DGVList);oleDbConnection(oleDBC);然后执行:
如下两个查询是正确的,如果把两个查询换成ExecuteReader()就报一个错误:当前command已经存在一个打开了DataReader必须先关闭才能再次查询;
(第一个查询用于检索所有的记录,第二个用于按用户输入条件检索)请问如何改正?谢谢{
            string path=Directory.GetCurrentDirectory().ToString()+@"\";
            string DBFile = "test.mdb";
            this.OLEDBC.Close();
            this.OLEDBC.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + DBFile;            try
            {
                this.OLEDBC.Open();
                this.oleDBA.SelectCommand.Connection = this.OLEDBC;
                this.oleDBA.SelectCommand.CommandText = @"select autoid as 序号,name as 姓名,sex as 性别, as 分数 " +
                                                        @"from temp order by  desc";
                this.oleDBA.SelectCommand.ExecuteNonQuery();
                DataTable dt = new DataTable();
                this.oleDBA.Fill(dt);
                this.DGVAllList.DataSource = dt;
            }
            catch(Exception eMessage)
            {
            }
            finally
            {
                this.OLEDBC.Close();
            }
            try
            {
                this.OLEDBC.Open();
                this.oleDBA.SelectCommand.Connection = this.OLEDBC;
                String Querystr = @"select autoid as 序号,name as 姓名,sex as 性别, as 分数 " +
                                                        @"from temp where(name like @name)and(sex=@sex)and(>=@) ";
                this.oleDBA.SelectCommand.CommandText = Querystr;                
                int  = 0;
                try
                {
                     = int.Parse(textBoxMark.Text);
                }
                catch (Exception eMessage)
                {
                     = 0;
                }
                
                this.oleDBA.SelectCommand.Parameters.Clear();
                this.oleDBA.SelectCommand.Parameters.AddWithValue("@name", "%" + this.textBoxName.Text + "%");
                this.oleDBA.SelectCommand.Parameters.AddWithValue("@sex", this.comboxSex.Text);
                this.oleDBA.SelectCommand.Parameters.AddWithValue("@", );
                               
                this.oleDBA.SelectCommand.ExecuteNonQuery();
                DataTable dt = new DataTable();
                this.oleDBA.Fill(dt);
                this.DGVSelect.DataSource = dt;
            }
            catch (Exception eMessage)
            {
                MessageBox.Show(eMessage.ToString());
            }
            finally
            {
                this.OLEDBC.Close();
            }
}

解决方案 »

  1.   

    一般来说,如果多次用到同一个Adapter来读取,则需要一些关闭的操作。
    首先定义DataReader:OleDbDataReader oleDbReader;然后用this.oleDbReader = this.oleDBA.SelectCommand.ExecuteReader()
    用完以后,记得this.oleDbReader.Close();
    然后this.OLEDBC.Close();这样下一次就可以用了。
      

  2.   

    那如何把DataReader放到DataSet或显示到DataGridView中呢?
      

  3.   

    要先放进DataSet才可以绑定到DataGridView。
    做一个函数来转化public DataSet ConvertDataReaderToDataSet(IDataReader reader)
    { DataSet ds = new DataSet();
    DataTable dt = new DataTable(); // 定义Meta Table
    DataTable SchemaTable = dr.GetSchemaTable();
    DataColumn dc = new DataColumn(); foreach (DataRow dr in SchemaTable.Rows)
    {
    dc = new DataColumn(dr["ColumnName"].ToString(), (Type)dr["DataType"]);
    dt.Columns.Add(dc);
    } // 装载数据表
    ds.Tables.Add(dt); // 从DataReader读数据
    object[] values = new object[dt.Columns.Count]; 
    try
    {
    dt.BeginLoadData();
    while (reader.Read())
    {
    reader.GetValues(values);
    dt.LoadDataRow(values, true);
    }
    }
    finally
    {
    dt.EndLoadData();
    reader.Close();
    } return ds;
    }