首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

ExecuteReader()与ExecuteNonQuery的有关问题

2011-12-29 
ExecuteReader()与ExecuteNonQuery的问题在程序中加入oleDbDataAdapter(oleDBA),两个DataGridView(DGVLis

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;
}

热点排行