关于 Dataset 的fill 方法:
使用DataAdapter填充DataSet
在选择了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;
使用Datadapter填充DataSet。
下面创建一个DataSet,它包含一个名为Department的表。使用名为daDepartment的DataAdapter来填充该表,并调用BeginLoadData方法来优化性能。
填充完该表之后,将一个DataGridView控件绑定到该表,该DataGridView将在屏幕上显示信息。
SqlDataAdapter daDept = new SqlDataAdapter(
"select * from humanresources.department", cn);
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",cn);
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();
总结以上所说,一个完整的算法可以这样写:
//创建SqlConnection数据库连接对象
SqlConnection Conn = new SqlConnection(sConnectionString);
//打开Conn
Conn.Open();
//创建并初始化SqlCommand对象
SqlDataAdapter Customer = new SqlDataAdapter("Select * From Customers", Conn);
DataSet ds = new DataSet();
//使用SqlDataAdapter的Fill方法填充DataSet
Customer.Fill(ds, "Customers");
DataTable tblCustomers; //创建一个DataTable数据表
tblCustomers = ds.Tables["Customers"];
//关闭数据连接
Conn.Close ( ) ;
Customer是个适配器,数据库对于dataset的数据流通就是通过适配器来实现的,数据库好比一个壶,SqlDataAdapter 就好比个漏斗,Dataset就好比个瓶子,整个过程就好比壶通过漏斗往瓶子里倒水,水就是数据。直接用Customer.Fill(ds)也是可以的,第一次Fill,都会在dataset中产生一个表,这个表的名字就是“Customers”,当一次填充多个表的时候 , 就不能这样Customer.Fill(ds)写了,必须把后面的名字写上
Customers 代表存储的表名 如果只是一张表的话就没多大用处了,但在多表的时候就有用处了