ExecuteReader()与ExecuteNonQuery的问题;
在程序中加入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 性别,mark as 分数 " +
@ "from temp order by mark 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 性别,mark as 分数 " +
@ "from temp where(name like @name)and(sex=@sex)and(mark> =@mark) ";
this.oleDBA.SelectCommand.CommandText = Querystr;
int mark = 0;
try
{
mark = int.Parse(textBoxMark.Text);
}
catch (Exception eMessage)
{
mark = 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( "@mark ", mark);
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();
}
}
[解决办法]
一般来说,如果多次用到同一个Adapter来读取,则需要一些关闭的操作。
首先定义DataReader:OleDbDataReader oleDbReader;
然后用this.oleDbReader = this.oleDBA.SelectCommand.ExecuteReader()
用完以后,记得this.oleDbReader.Close();
然后this.OLEDBC.Close();
这样下一次就可以用了。
[解决办法]
要先放进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;
}