一、DataAdapter原理
可以用Command对象和DataReader对象来执行查询,并检查结果。
那如果想要把执行查询所得到的结果存储在一个DataSet对象中,我们该怎么办?
ADO.NET2.0 给我们提供了DataAdapter对象来解决这个问题,DataAdapter类是ADO.net对象模型中联机和脱机这两部分之间的桥梁。可以能过DataAdapter对象来将取得的结果存储在DataSet中。
DataSet本身是与数据库没有作何关系的,它可以存储任何形式的数据。所以可以看出,DataAdapter设计的目的在于,为处理脱机数据提供支持。
DataAdapter是专门为处理脱机数据而设计的。
DataAdapter的结构:
在使用DataAdapter时,你会发现,建立的连接(connection)并不需要打开连接(open),那么这是为什么?
因为DataAdapter在通过Fill方法填充DataSet中的Table时,自动会打开一个连接,并且在Fill方法后,会自动关闭(Close)这个连接。
另外,DataAdapter本身与DataSet之间也没有任何连接。
同时,DataAdapter中包含有用于向数据库回递存储在DataSet中的改动的更新逻辑。
那么,DataAdapter是怎样将数据填充到DataSet中的DataTable中的呢?其实,DataAdapter还是利用了DataReader。例如:
DataSet ds = new DataSet();
DataTable tbl = ds.Tables.Add("Customers"); //在DataSet中建立一个Customers表
OleDbCommand cmd = new OleDbCommand();
OleDbDataReader rdr = cmd.ExecuteReader();
DataRow row; //定义DataRow
while ( rdr.Read())
{
row = tbl.NewRow(); //在dataset中的Customers表中添加一行
row ["CustomerID"] = rdr ["CustomerID"]; //赋值
tbl.Rows.Add(row); //添加到Customer表中
}
rdr.Close();
从这同这段代码,就可以看到DataAdapter实际上还是利用了DataReder类,来实现了对DataTable的填充。
实现的过程是这样的:new 一个DataAdapter对象 --------> DataAdapter利用自己的SelectCommand来生成
一个DataReader------------>利用DataReader填充DataSet中的DataTable。
DataTable是数据的一个副本。