熟悉ADO编程的程序员都知道,ADO中最重要的是引入了三个智能指针:Connection_Ptr、Command_Ptr和Recordset_Ptr。而在.NET的框架下,ADO.NET与ADO存在着很大的不同,ADO.NET为程序员提供了更高层的接口和组件,数据处理采用面向连接的双层模型。同时,为方便程序员在断开方式下处理数据,ADO.NET提供了数据处理中介工具DataAdapter组件和能够独立于数据源之外的缓冲数据集DataSet组件。下面我们就借助ADO.NET处理数据的框架来认识一下DataAdapter和DataSet的工作流程:
DataAdapter:数据适配器,提供了两个很重要的方法:Fill和Update,该组件可以看做是一个工具,如果把DataSet看做一个数据仓库的话,那么DataAdapter就可以看作是一辆运输车,是用来Fill和Update的工具,而DataSet的数据集则是Fill的对象,数据库是Update的对象。
DataSet:独立于数据源外,用来临时存放数据的数据仓库或者称为数据集,因此可以很好的支持断开方式的数据处理。DataSet的基本结构如下:
DataSet是一系列数据表的集合,相当于数据源的一个快照,需要注意的是,DataSet中的数据是置于内存的。
下面举一个简单的例子以了解DataAdapter和DataSet的用法:
DataSet ds = new DataSet();
OleDbCommand m_AccessComm;
OleDbDataAdapter m_AccessAdapter;
OleDbConnection m_ADOConn = new OleDbConnection();
m_ADOConn.ConnectionString = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = .//spinfo.mdb";
m_ADOConn.Open();//数据库连接并打开
m_AccessComm = new OleDbCommand("Select * From spinfo_rec", m_ADOConn);
m_AccessAdapter = new OleDbDataAdapter(m_AccessComm);
m_AccessAdapter.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];//用DataGridView控件绑定数据源并显示
以上是用DataGridView控件来显示Access数据库文件spinfo.mdb中的表spinfo_rec的信息,当我们在DataGridView中修改数据后,可以刷新DataSet,通过DataAdapter的Update方法来刷新源数据库。
OleDbCommandBuilder dcb = new OleDbCommandBuilder(m_AccessAdapter);
m_AccessAdapter.SelectCommand = new OleDbCommand("SELECT * FROM spinfo_rec",m_ADOConn);
m_AccessAdapter.Update(ds);//刷新DataSet的同时也将源数据库中的表刷新
//清除DataSet内容,重新将更新后的的数据库内容Fill到DataSet
ds.Tables[0].Clear();
m_AccessAdapter.Fill(ds,"spinfo_rec");
由于之前已经将DataGridView绑定到ds,所以ds的内容就更新到了DataGridView中。
在上面的例子中,使用到了OleDbCommandBuilder, 这个组件比较有意思,他会自动生成数据库的INSERT/UPDATE/DELETE命令,而SELECT命令则需要事先指定。而且它会自动根据数据的变化来自动判断选择使用哪种SQL语句。有兴趣的朋友可以直接在WinForm中拖一个DataAdapter的控件,看看dataAdapter的SelectCommand/InsertCommand/UpdateCommand/DeleteCommand是如何写的。