前言:ADO.NET概述
在学习DataTable知识之前,我们有必要了解下ADO.NET。以下摘自MSDN:
ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、处理和更新所包含的数据。
ADO.NET 通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET Framework 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet 对象也可以独立于 .NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。
ADO.NET 类在 System.Data.dll 中,并且与 System.Xml.dll 中的 XML 类集成。当编译使用 System.Data 命名空间的代码时,请引用 System.Data.dll 和 System.Xml.dll。有关连接到数据库、从数据库中检索数据并在命令提示中显示该数据的 ADO.NET 应用程序示例,请参见 ADO.NET 示例应用程序。
ADO.NET 向编写托管代码的开发人员提供了类似于 ActiveX 数据对象 (ADO) 为本机组件对象模块 (COM) 开发人员提供的功能。
ADO.NET中包含的对象及其关系如下图:
1、DataTable简介
1.1 DataTable的定义
表示内存中数据的一个表。 我们知道数据库中存储的是实体表,实体表中有一系列的数据。而DataTable即存储在内存中的表,在持久化到数据库之前,是不会对数据库产生影响的,持久化到数据库可以使用dataAdapter.Update的方法(dataAdapter是某个实例化的DataAdapter对象)。
注意:当访问 DataTable 对象时,请注意它们是按条件区分大小写的。例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。
1.2 得到DataTable
得到DataTable有许多方法,下面简单罗列出来:
1.2.1通过构造函数得到DataTable
DataTable() 不带参数初始化DataTable 类的新实例。
DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例。
DataTable(string tableName, string tableNamespace) 用指定的表名和命名空间初始化DataTable 类的新实例。
1.2.2通过DataSet获取DataTable
DataTable dt=ds.Tables["TableName"];//TableName是表名
1.2.3 通过DataRow自定义DataTable的结构
foreach(DataRow dr in drs)
{
dt.ImportRow(dr);
}
1.3 DataTable常用属性
CaseSensitive 指示表中的字符串比较是否区分大小写。
ChildRelations 获取此DataTable 的子关系的集合。
Columns 获取属于该表的列的集合。
Constraints 获取由该表维护的约束的集合。
DefaultView 获取可能包括筛选视图或游标位置的表的自定义视图。
HasErrors 获取一个值,该值指示该表所属的
DataSet 的任何表的任何行中是否有错误。
MinimumCapacity 获取或设置该表最初的起始大小。该表中行的最初起始大小。默认值为 50。
Rows 获取属于该表的行的集合。
TableName 获取或设置DataTable 的名称。
1.4 DataTable是ADO.NET中的重要成员
DataSet中可包括多个 DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的 Update方法。
2、DataTable成员之DataRow
DataTable是由一个个DataRow组合而成,DataTable.Rows[i]即表示其中的第i行。
DataRow有一个十分重要的状态(RowState),这个状态经常被我们忽略,从而导致一些莫名其妙的bug。RowState 的值是一个枚举类型的,RowState 有 Added, Modified, Unchanged, Deleted, Detached 几种, 分别表示 DataRow 被添加, 修改, 无变化, 删除, 从表中脱离. 在调用一些方法或者进行某些操作之后, 这些状态可以相互转化。我们不做什么判断就开始操作DataRow,这就有可能导致某些状态为Deleted的行也同时被操作,这样就有可能导致脏数据的产生。