C# 关于 Dataset 的fill 方法

2024-12-18 14:18:25
推荐回答(3个)
回答1:

关于 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 ( ) ;

回答2:

Customer是个适配器,数据库对于dataset的数据流通就是通过适配器来实现的,数据库好比一个壶,SqlDataAdapter 就好比个漏斗,Dataset就好比个瓶子,整个过程就好比壶通过漏斗往瓶子里倒水,水就是数据。直接用Customer.Fill(ds)也是可以的,第一次Fill,都会在dataset中产生一个表,这个表的名字就是“Customers”,当一次填充多个表的时候 , 就不能这样Customer.Fill(ds)写了,必须把后面的名字写上

回答3:

Customers 代表存储的表名 如果只是一张表的话就没多大用处了,但在多表的时候就有用处了