3 回答
TA贡献1803条经验 获得超6个赞
关于 Dataset 的fill 方法:
使用DataAdapter填充DataSet
在选择了DataAdapter的类型(SqlDataAdapter或OleDbDataAdapter)并配置了DataAdapter来执行所需的任务之后,可以用创建的DataAdapter来填充DataSet。
1.使用DataAdapter填充DataSet
可以使用DataAdapter来填充DataSet。调用DataAdapter的Fill方法,并指定要填充的DataSet表。Fill方法隐式执行DataAdapter的SelectCommand中的SQL查询,查询的结果用于定义DataSet表的结构,并用数据来填充表。此外,Fill方法是可重载的。例如:
12345 | rowsAffected = aDataAdapter.Fill(DataSet); rowsAffected = aDataAdapter.Fill(DataSet,strDataTableName); rowsAffected = aDataAdapter Fil](DataTable); |
当填充DataSet时,DataAdapter会强制一些约束,例如主键唯一性。为了提高性能,在填充DataSet前将EnforceConstraints属性设置为false,这将在数据加载过程中禁用约束检查。
1 | aDataset.EnforceConstraints= false ; |
使用Datadapter填充DataSet。
下面创建一个DataSet,它包含一个名为Department的表。使用名为daDepartment的DataAdapter来填充该表,并调用BeginLoadData方法来优化性能。
填充完该表之后,将一个DataGridView控件绑定到该表,该DataGridView将在屏幕上显示信息。
123456789101112131415 | 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对象。代码如下:
1234567891011121314151617 | 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方法。
1234567 | cn.Open(); daCusomers.Fill(ds); daOrders.Fill(ds); cn.Close(); |
总结以上所说,一个完整的算法可以这样写:
12345678910111213141516171819202122232425 | //创建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 ( ) ; |
- 3 回答
- 0 关注
- 1468 浏览
添加回答
举报