DataSet是支持Ado.NET的断开式和分布式数据方案的核心对象,它是数据在内存中驻留的表示形式,它可用于多种不同的数据源,用于XML数据,或用于管理应用程序本地数据;
DataSet表示包括相关表、约束和表间关系在内的整个数据集.
DataSet 用于执行以下功能:
l 在应用程序中将数据缓存在本地,以便可以对数据进行处理。如果只需要读取查询结果,DataReader 是更好的选择。
l 在层间或从 XML Web 服务对数据进行远程处理。
l 与数据进行动态交互,例如绑定到 Windows 窗体控件或组合并关联来自多个源的数据。
l 对数据执行大量的处理,而不需要与数据源保持打开的连接,从而将该连接释放给其他客户端使用。
DataAdapter 使用 DataReader 来填充 DataSet 的内容(参考MSDN)
示例:
//创建一个DataSet对象.(如果你没有为它指定名字,则自动生成"NewDataSet")
ds = new DataSet("MyDataSet");
注意:如果DataSet中只存在一个表,是不需要对表名区分大小写的.反之,则要区分.
DataAdapter在数据源和DataSet之间,起着桥梁的作用.
DataAdapter的Fill 方法使用 DataReader 对象来隐式地返回用于在 DataSet 中创建表的列名称和类型以及用于填充 DataSet 中的表行的数据。表和列仅在不存在时才创建;否则,Fill 将使用现有的 DataSet 架构。如果 Fill 发现某个表存在主键,对于主键列的值与从数据源返回的行的主键列的值匹配的行,将使用数据源中的数据重写 DataSet 中的数据。如果未找到任何主键,则数据将追加到 DataSet 中的表。主键不会创建,除非主键存在于数据源中并且 DataAdapter.MissingSchemaAction 设置为 MissingSchemaAction.AddWithKey。
如果DataAdapter遇到多个结果集,将在DataSet中自动创建多个表,如果在Fill中指定表名,则以YourTableNameN递增表名,如果没有指定,则以TableN递增;
你可以使用多个DataAdapter来填充一个DataSet,这样,你就可以连接多种类型的数据库,却放在同一个DataSet中,并还能关联它们(比如对两个来自不同数据库的表进行DataRelation).
示例:注意,例子中并没有显式的使用conn.Open()/Close(),其实当Fill发现连接尚未打开时,它将自动隐式的打开SqlDataAdapter正在使用的连接,并且Fill还将在完成时自动隐式的关闭连接.并且Fill方法会在填充后,默认情况下会自动将所有行设置为UnChanged.(是否自动设置为UnChanged,由DataAdapter的AcceptChangesDuringFill属性控制.如果AcceptChangesDuringFill=false,那么新添加的行状态就是Added)
conn = new SqlConnection(strConn);
ds = new DataSet();
SqlDataAdapter da1 = new SqlDataAdapter("SELECT * FROM Products", conn);
da1.Fill(ds, "Products");
//将指定行Fill到DataSet中
//0:表示Fill的行标 1:表示要填充的行数
da.Fill(ds, 0, 1, "Product");
注意:应显式Open/Close连接,尽可能短的减少连接时间;
使用DataRow对象及其属性和方法检索、评估、插入、删除和更新DataTable中的值.
DataRow对象没有直接在代码中使用的构造函数,一般使用DataTable的NewRow()方法来新建.
一个DataRow对象被创建后,其状态是Detached(比如 DataRow row = table.NewRow()时),是孤立存在的;当table.Rows.Add(row)后,其状态就转变成了Added;当修改了这个DateRow(比如:table.Rows[0][“NAME”]=”bush”)以后,其状态就转变成了Modified;当调用table.Delete(row)方法后,其状态就转变成了Deleted,不过此行依然存在于DataTable中,如果你Count行数,依然没有变的,只有调用了AcceptChanges后才真正删除,或是你调用table.Remove(row),此行即可一步删除,此时状态也回归到Detached.
一旦调用了AcceptChanges()方法后,Added、Modified、Unchanged将保留当前值(只有Current值了),Deleted状态的行将从DataTable中移除,最后所有行的状态都是Unchanged.
Fill方法会自动调用AcceptChanges()方法,将DataTable中的行全部置于Unchanged状态;如果Fill方法中指定的那个DataSet中的DataTable不存在时,它将新生成一个同数据源同结构的DataTable.
DataRow的RowState属性
RowState |
说明 |
Unchanged |
自上次调用 AcceptChanges 之后,或自 DataAdapter.Fill 创建了行之后,未做出过任何更改。 |
Added |
已将行添加到表中,但尚未调用 AcceptChanges。 |
Modified |
已更改了行的某个元素。 |
Deleted |
已将该行从表中删除,并且尚未调用 AcceptChanges。 |
Detached |
该行不属于任何 DataRowCollection。新建行的 RowState 设置为 Detached。通过调用 Add 方法将新的 DataRow 添加到 DataRowCollection 之后,RowState 属性的值设置为 Added。 对于已经使用 Remove 方法(或是在使用 Delete 方法之后使用了 AcceptChanges 方法)从 DataRowCollection 中移除的行,也设置为 Detached。 |
注意: DataRowCollection和 DataRow 的关系:DataRowCollection表示DataTable中实际DataRow的对象.(见下例)
//加上索引,就是DataRowCollection(集合)中的某一行了,故用DataRow对象表示
DataRow row = table.Rows[1];
row["姓名"] = "蝙蝠侠";
//table.Rows 的返回值就是 DataRowCollection(集合)
DataRowCollection rowC = table.Rows;
rowC[1]["姓名"] = "蝙蝠侠";
DataColumn是用于创建DataTable的架构的基本构造块.每个DataColumn都有DataType属性,DataTable中各列的属性必须与数据源中列的属性相匹配.
DataColumn的各属性示例:
DataColumn ID = new DataColumn("学号");
ID.AutoIncrement = true;
//ID.AutoIncrementSeed = 5;//自动增列的起始值
//ID.AutoIncrementStep = 5;//增量
DataColumn Name = new DataColumn("姓名");
Name.AllowDBNull = false;//