基于集的访问有两类方式,一个是DataSet,该类相当于内存中的数据库,在命名空间System.Data中定义;另外一个类是DataAdapter,该类相当于DataSet和物理数据源之间的桥梁。从本质上讲,DataAdapter类是两个类的结合,因为其有SqlDataAdapter和OleDbDataAdapter 两个版本。
DataSet由大量相关的数据结构组成。DataSet是一个完整的数据集。在DataSet内部,主要可以存储5种对象.
DataSet的对象
对 象 | 功 能 |
DataTable | 使用行、列形式来组织的一个矩型数据集 |
DataColumn | 一个规则的集合,描述决定将什么数据存储到一个DataRow中 |
DataRow | 由单行数据库数据构成的一个数据集合,该对象是实际的数据存储 |
Constraint | 决定能进入DataTable的数据 |
DataRelation | 描述了不同的DataTable之间如何关联 |
在DataSet内部是一个或多个DataTable的集合。在每个DataRow、DataColumn 和Constraint的集合以及DataRelation的两个集合。DataTable内部的DataRelation集合对应于父关系和子关系,二者建立了DataTable之间的连接。DataSet内部的 DataRelation集合是所有 DataTable中的所有DataRelation的一个聚合视图。
DataSet数据更新
在DataTable 中执行的插入、更新和删除操作并不会自动写回数据库。如果想把更改写回数据库,则需要手动去完成,这个操作由DataAdapter.Update完成。下面的代码演示了如何使用DataSet和DataAdapter对数据库进行更改。
SqlDataAdapter sda=new SqlDataAdapter("select * from student","server=(local); uid=sa;pwd=; database= stu");
//声明SqlCommandBuilder对象,并将其实例化
SqlCommandBuilder builder=new SqlCommandBuilder(sda);
DataSet ds=new DataSet(); //声明一个DataSet对象,并将其实例化
Sda.Fill(ds,"student"); //将student表填充到数据集中
DataTable table=ds.Tables["student"];//插入数据
DataRow row=table.NewRow(); //插入一行
row["stu_id"]="1001"; //该行的一列的值
row["stu_name"]="张强"; //该行另外一列的值
table.Rows.Add(row); //插入一条记录
sda.Update(table); //更新数据
DataAdapter中的UPDATE方法检查传递给表的每一条记录,把自上次插入后的数据写回数据库。如果DataSet中包含了多个被修改的DataTable,就把整个DataSet传递给UPDATE,所有改变会被一次性写回。
DataAdapter对象
DataAdapter(即数据适配器)对象是一种用来充当DataSet对象与实际数据源之间桥梁的对象。DataSet对象是一个非连接的对象,它与数据源无关。而DataAdapter则正好负责填充它并把它的数据提交给一个特定的数据源,它与DataSet配合使用,可以执行新增、查询、修改和删除等多种操作。
DataAdapter对象是一个双向通道,用来把数据从数据源中读到一个内存表中,以及把内存中的数据写回到一个数据源中。两种情况下使用的数据源可能相同,也可能不相同。而这两种操作分别称作填充(FILL)和更新(UPDATE)。
当SqlDataAdapter对象通过FILL方法填充DataSet对象时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非将MissingSchemaAction属性设置为AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用FillSchema方法,让SqlDataAdapter对象创建DataSet对象的架构,并在用数据填充它之前就将主键信息包括进去
DataAdapter对象的常用属性及说明
属 性 | 描 述 |
DeleteCommand | 获取或设置一个语句或存储过程,以从数据集删除记录 |
InsertCommand | 获取或设置一个语句或存储过程,以在数据源中插入新记录 |
SelectCommand | 获取或设置一个语句或存储过程,用于在数据源中选择记录 |
UpdateBatchSize | 获取或设置每次到服务器的往返过程中处理的行数 |
UpdateCommand | 获取或设置一个语句或存储过程,用于更新数据源中的记录 |
DataAdapter对象的方法
方 法 | 描 述 |
Dispose | 删除该对象 |
Fill | 用从源数据读取的数据行填充至DataSet对象中 |
FillSchema | 将一个DataTable加入到指定的DataSet中,并配置表的模式 |
GetFillParameters | 返回一个用于SELECT命令的DataParameter对象组成的数组 |
Update | 在DataSet对象中的数据有所改动后更新数据源。 |
方法用于更新集合,如同用户已打开“外接程序管理器”对话框一样,或将对象的窗口布局设置为当前窗口布局。
使用UPDATE方法可以用当前窗口布局替换原来存储的窗口布局。
使用DataAdapter填充DataSet的方法是DataAdapter.Fill(),该方法的一个经典代码如下。
//数据库名为stu,用户名为sa,用户密码为空
SqlConnection con=new SqlConnection("server=(local);uid=sa;pwd=;database=stu");
Con.Open();//打开数据库连接
SqlDataAdapter sda=new SqlDataAdapter("select * from student");//查询student表
DataSet ds=new DataSet();
Sda.Fill(ds, "student");//填充数据集