DataAdapter的Fill⽅法(转)
使⽤DataAdapter填充DataSet(1)
在选择了DataAdapter的类型(SqlDataAdapter或OleDbDataAdapter)并配置了DataAdapter来执⾏所需的任务之后,可以⽤创建的DataAdapter来填充DataSet。1.使⽤DataAdapter填充DataSet
可以使⽤DataAdapter来填充DataSet。调⽤DataAdapter的Fill⽅法,并指定要填充的DataSet表。Fill⽅法隐式执⾏
DataAdapter的SelectCommand中的SQL查询,查询的结果⽤于定义DataSet表的结构,并⽤数据来填充表。此外,Fill⽅法是可重载的。例如:
rowsAffected = aDataAdapter.Fill(DataSet);
rowsAffected = aDataAdapter.Fill(DataSet,strDataTableName); rowsAffected = aDataAdapter Fil](DataTable);
当填充DataSet时,DataAdapter会强制⼀些约束,例如主键唯⼀性。为了提⾼性能,在填充DataSet前将EnforceConstraints属性设置为false,这将在数据加载过程中禁⽤约束检查。aDataset.EnforceConstraints=false;
【实例10-5】 使⽤Datadapter填充DataSet。
下⾯创建⼀个DataSet,它包含⼀个名为Department的表。使⽤名为daDepartment的DataAdapter来填充该表,并调⽤BeginLoadData⽅法来优化性能。
填充完该表之后,将⼀个DataGridView控件绑定到该表,该DataGridView将在屏幕上显⽰客户信息。SqlDataAdapter daDept = new SqlDataAdapter( \"select * from humanresources.department\DataSet dsDept = new DataSet();
dsDept.Tables.Add(new DataTable(\"Department\")); dsDept.Tables[0].BeginLoadData(); daDept.Fill(dsDept,\"Department\"); dsDept.Tables[0].EndLoadData();
dataGridView1.DataSource = dsDept.Tables[\"Department\"];
DataAdapter和Command在如何处理Connection对象上有⼀个主要的区别:在调⽤⼀个Command对象的执⾏⽅法前,将打开与该Command相关联的Connection对象,否则Command会抛出⼀个异常;DataAdapter则没有这样的需求。
如果要调⽤DataAdapter对象的Fill⽅法,并且SelectCommand属性的Connection已经关闭,DataAdapter将⾃动打开连接、提交查询、提取结果,然后关闭Connection。读者也许会发现DataAdapter⾮常有条不紊,它总是将SelectCommand属性的Connection恢复到其初始状态。但是如果在调⽤Fill⽅法之前已经打开Connection,调⽤以后Connection仍然处于打开状态。因此使⽤DataAdapter的Fill⽅法时,不需要⼿⼯打开Connection。
但在⼀些特殊情况下,也需要在执⾏DataAdapter的Fill⽅法之前先打开Connection。例如,在应⽤程序启动时,⽤多个DataAdapter对象将多个查询的结果填充到DaraSet中。可以使⽤DataAdapter对象的构造函数强制每个DataAdapter都使⽤相同的Connection对象。代码如下:
string strConn = \"Provider=SQLOLEDB;Data Souroe=(local)\"+ \"Initial catalog=Northwind;Trusted_connection=Yes;\"; OleDbConnection cn = new OleObconnection(strconn); OleDbOataAdapter daCustomers,daOrders;
daCustomers = new OleDbDataAdapter(\"SELECT ... FROM Customers\",cn); daOrders = new OleDbDataAdapter(\"SELECT ... FROM orders\ds=new DataSet(); daCustomers Fill(ds): daOrders.Fill(ds);
实际上,当两次打开和关闭Connection时,每次都调⽤DataAdapter对象的Fill⽅法。为了避免重复地多次打开和关闭
Connection对象,在对DataAdapter对象调⽤Fill⽅法之前,先调⽤Connection对象的Open⽅法。如果要在填充数据以后关闭Connection,则应该像下⾯例⼦中显⽰的那样调⽤Close⽅法。
cn.Open();
daCusomers.Fill(ds); daOrders.Fill(ds); cn.Close();
2.⾼效地填充DataSet
填充DataSet最有效的⽅法是在填充DataSet前先定义显⽰架构,这意味着在填充DataSet前已经知道了DataTable、DataColumn和DataRelation。
断开式应⽤程序从数据库服务器中检索数据,由于事先知道数据的结构,因此可以创建类型化DataSet,其架构与所检索的数据结构相同,这使得数据在运⾏时可以被⾼效地加载。在窗体设计器中创建类型化DataSet的步骤如下:
(1)将SqlDataAdapter控件或OleDbDataAdapter控件从⼯具箱拖放到窗体上。(2)使⽤\"数据适配器配置向导\"按要求配置DataAdapter。
(3)右击新的DataAdapter对象,在弹出的快捷菜单中选择\"⽣成数据集\"命令。(4)在弹出的\"⽣成数据集\"对话框中为新的DataSet类命名。(5)选择要添加到DataSet中的表。
(6)选中\"将此数据集添加到设计器\"复选框。
(7)单击\"确定\"按钮,将创建⼀个从DataSet继承的类型化DataSet类,还将创建这个类的⼀个实例并将它添加到应⽤程序中。
(8)右击新的DataSet对象,在弹出的快捷菜单中选择\"查看架构\"命令。
(9)在XML设计器中检查DataSet的XSD架构。如果需要,可以通过将XSD架构元素从⼯具箱拖放到XML设计器上来修改和扩展XSD架构