|
本帖最后由 紫川文秀 于 2014-1-2 17:43 编辑
ADO.NET包含的类位于System.Data命名空间
DataTable类:
一个数据表由三个主要类组成,即DataTable、DataColumn、DataRow。三个类分别定义了表、表中的列和表中的数据行。
定义表:
DataTable someTable = new DataTable();
DataTable someTable = new DataTable("someName");
添加DataColumn实例填充DataTable的Columns集合,DataColumn类在表的架构内定义了一个列。
DataColumn key = new DataColumn("ID", typeof(long));
someTable.Columns.Add(key);
DataTable对象的Columns集合包含一个Add重载,可以直接将标准DataColumn参数传递给Add方法:
someTable.Columns.Add("name",typeof(string));
DataColumn类包括几个很有用的属性:
AllowDBNull 是否允许DBNull值
AutoIncrement
AutoIncrementSeed
AutoIncrementStep 控制列的自动递增功能
Caption 标题或描述
ColumnName 列名称,通常通过构造函数指定
DataType 列的数据类型,通常由构造函数指定
DateTimeMode 时区信息
DefaultValue 创建新行的默认值
MaxLength 文本数据列,设定文本最大长度.默认为-1,不限定长度.
ReadOnly 是否只读
Unique 布尔值,设置为True时,唯一值约束
DataTable类包含一个PrimaryKey属性,用于指定一列或多列构成表的主键.主键由DataColumn对象数组组成.
someTable.PrimaryKey = new DataColumn[] { someTable.Columns["ID"]};
可以用数据集设计器,可视化的设计DataTable.
使用DataRow类向表中添加数据行.
DataTable类中包含NewRow方法,用于生成一个表所特有的数据行.每次向表中添加新行,永远都是用NewRow方法生成一个新的DataRow
DataRow oneRow = someTable.NewRow();
DataRow类包含ItemArray属性,这也是默认属性(可以省略".ItemArray").用它可以访问定义的每个列,可以用列名称访问,也可以用从0开始的索引号访问,还可以按实例来访问.
oneRow["ID"] = 1;
oneRow[0] = 1;
DataColumn oneColumn = someTable.Columns["ID"];
oneRow[oneColumn] = 1;
oneRow.ItemArray[1] = "Michael";(这里设置会不成功,省略".ItemArray"就可以成功设置,但是读取的时候带".ItemArray"可以正常使用)
将必要的数据值指定给新行后,用DataTable的Rows.Add方法将新行加入表中
someTable.Rows.Add(oneRow);
这个Add方法有一个重载,可省略对象创建过程,直接以参数方式提供最终的字段值.所提供的全部值,和出现的顺序和位置都必须与表的DataColumn实例相同.
someTable.Rows.Add(2, "mike");
表数据的删除.DataTable.Rows集合有Remove(按实例)和RemoveAt(按索引)方法,IndexOf方法可以根据实例返回行索引号.InsertAt方法向表中插入行,有两个参数,第一个为行实例,第二个为插入位置.Clear方法可以一次性清空表格.虽然这些方法很方便,但不存留痕迹,无法执行特定操作(包括外部数据库管理),所以不常用.
常用的方法是批处理,推迟数据更改,或一次进行多项更改.ADO.NET包含表和行级别的功能.可以在保证数据完整性的前提下,整体接收或拒绝"所提议的"更改.
AcceptChanges方法和RejectChanges方法.
删除行用行的Delete方法(可同步数据库)
行状态.
DataRow.RowState属性,枚举值
DataRowState.Detached
任何一个未添加到表的行的默认状态
DataRowState.Added
添加的行,未确认更改
DataRowState.Unchanged
已经添加的行,上次确认更改后未做任何动作
DataRowState.Delete
已删除的行,但未确认
DataRowState.Modified
行的字段被更改
行版本.
对行内字段进行更改时,会保存每个更改值的多个副本.行版本适用于整行,仅有一个字段被更改也是如此.
DataRowVersion.Original
最近使用AcceptChanges之后的值
DataRowVersion.Proposed
有字段已更改,但未确认
DataRowVersion.Current
对于未确认更改时,与Proposed相同,确认后的与Original相同
DataRowVersion.Default
连接到表的行,与Current相同,未连接表的行与Proposed相同
行的ItemArray属性返回的是Current版本
数据验证:
如果对所有赋值都进行异常处理,将大大影响性能.为了简化异常监视,DataRow类包含了BeginEdit方法.使用此方法,赋值时数据检查会被延迟,直到发出相应的DataRow.EndEdit()
添加列级别或行级别错误,会使DataRow.HasErrors和DataTable.HasErrors属性都设置为True,但不会触发异常.确认数据前,监视HasErrors属性(若有错误,使用DataRow.CancelEdit()方法返回原状态),以确保数据正确.ClearErrors会清除所有先前的错误通知.即使Endedit方法完成了对行的更改,这些更改依然未提交,必须调用AcceptChanges方法才会确认更改.
oneRow.BeginEdit();
try
{
oneRow[0] = 2;
oneRow.EndEdit();
someTable.AcceptChanges();
}
catch(Exception ex)
{
oneRow.CancelEdit();
Console.WriteLine(ex.Message);
}
访问数据(单表)
DataTable.Rows的Find方法,可以根据主键查找某一行.
DataRow findRow = someTable.Rows.Find(2);
DataTable的Select方法,类似于SQL语句,方法有三个参数,第一个为筛选条件(类似SQL的where子句),第二个是排序规则(类似于SQL的Order by),第三个参数为行状态.
DataRow[] selectRows = someTable.Select("[ID]>10");
筛选表达式元素:
列名称
内嵌空格或其他非文字字符时,用[列名称]
比较运算符
<; >; <=; >=; <>; =;
IN (x,xx,xxx)
匹配集合
LIKE
通配符*(一个)和%(多个),只能在末尾
AND; OR; NOT;
括号 ()
常量
字符串/数字等等
CONVERT(expression,new-type)
强制转换类型
LEN
字符串长度
ISNULL(列名,默认值)
如果列值为DBNULL则返回默认值,否则返回列的值
IIF
条件函数
TRIM
去除末尾空格
substring
提取字符串
对比字符串时,Select方法默认忽略大小写,若要匹配大小写,可以设置CaseSensitive属性
someTable.Casesensitive=true;
添加表达式列
someTable.Columns.Add("LENG", typeof(int), "[ID]+len([name])");
DataSet类,表集合/表关系/字段约束条件
DataTable table2 = new DataTable("someAge");
table2.Columns.Add("ID", typeof(long));
table2.Columns.Add("AGE", typeof(int));
table2.Rows.Add(2, 50);
table2.Rows.Add(22, 80);
DataSet someSet = new DataSet("SetName");
someSet.Tables.Add(someTable);
someSet.Tables.Add(table2);
someSet.Relations.Add("OneToOne", someTable.Columns[0], table2.Columns[0]);
Relations类,表间关系,构造函数有7个重载,父表必须在前,子表字段必须在后.
DataRow类有两个方法,GetChildRows和GetParentRow,用于从链接关系的另一端提取相关行
Console.WriteLine(table2.Rows[1].GetParentRow("OneToOne")[1]);
在父子关系中实施串联删除:
找到定义链接关系的DataRelation实例,将DataRelation对象的DeleteRule设置为System.Data.Rule.Cascade
定义表约束:
Constraint类,用于表约束.有两种类型的约束,唯一列(System.Data.UniqueConstraint)和外键(System.Data.ForeignKeyConstraint).
聚合数据:
聚合函数由一组相关值返回一个计算值。共有7个聚合函数。
Sum
数字求和
Avg
数值的平均值
Min
任意可排序值的最小值
Max
任意可排序值的最大值
Count
计数,只要非NULL就可以计数
StDev
数字列的统计标准偏差
Var
数字列的统计方差
聚合总是对单个DataTable列进行汇总。聚合函数仅考虑非NULL值,NULL值被排除在聚合之外。
DataTable对象的Compute方法,用于单一聚合计算。Compute方法有两个字符串参数,第一个是聚合函数表达式,第二个是筛选器,类似DataTable的Select方法中的筛选表达式。
Console.WriteLine(table2.Compute("Count([ID])",""));
使用聚合函数在父表中添加表达式列,聚合对应子表中的列。聚合函数只能对单个列操作,若要子表中多个列计算后聚合,必须先在子表添加相应表达式列。(Count(Child.[列名]))
在子表中可以添加表达式列,引用父表中某个字段。(Parent.[列名])
DataView类,类似SQL Server的视图。DataView用来公开一组DataRow对象,但它并不包含DataRow实例,而是包含DataRow的索引,这个索引就是DataRowView实例。ADO.NET使用DataRowView类来管理一个行的各个版本,特别是还没用DataTable.AcceptChanges方法确认更改时。DataRowView.Row属性根据DataRowView实例的设置返回实际行。
创建DataView:
DataView someView = new DataView(someTable);
someView.RowFilter = "ID>1";//筛选行
someView.Sort = "name desc";//行排序
DataView 实例的RowStateFilter属性,指定公开的行状态.默认状态显示所有满足RowFilter准则的可用行.DataViewRowState枚举值:
DataViewRowState.None
所有行,不考虑状态,在实际应用中,会筛选掉所有行,一个不留
DataViewRowState.Unchanged
只包含没有更改数据和状态的行
DataViewRowState.Added
已经被添加但还没确认的行
DataViewRowState.Deleted
已经被删除但还没确认的行
DataViewRowState.ModifiedCurrent
已经被修改的行,公开的行是修改后的数值
DataViewRowState.ModifiedOriginal
已经被修改的行,公开的行是修改前的原始数据
DataViewRowState.OriginalRows
未被更改的行,包括已删除的行
DataViewRowState.CurrentRows
所有当前状态为未删除的行,包括新行在内,一般用这个状态作为构造函数参数
每次修改RowFilter/Sort/RowStateFilter字段时,DataView会重建底层DataTable索引,即使以前未设置这些属性也会重建.为了减少重建次数,DataView类构造函数的一个重载,接受起始的RowFilter/Sort/RowStateFilter属性值.
DataView someView = new DataView(someTable, "[ID]>1", "[name] desc", DataViewRowState.CurrentRows);
DataView类包含三个布尔属性.用来限制通过此视图针对数据行执行的操作.这些限制仅用于视图,不影响底层表操作.
AllowNew
是否允许新建行
AllowEdit
是否允许编辑行
AllowDelete
是否允许删除行
使用DataView:
DataView.Count属性,返回应用了RowFilter和RowStateFilter属性之后,符合条件的行总数.
DataView.ToTable方法,生成新的DataTable对象,它只包含经过筛选的行和指定的列
DataTable filterTable = someView.ToTable("filterTable", true, new string[]{"name"}); //第一个参数为新生产表的名称,第二个参数为是否去除重复,第三个数组参数为制定要的列名称
Console.WriteLine(filterTable.Rows[0][0]);
将数据集(DataSet)以XML格式导出到文件
1.创建DataSet实例
2.添加相关DataTable,DataRelation等
3.调用DataSet的WriteXml方法,将文件名作为参数传递给这个方法
将XML文件导入一个新的数据集中
1.创建一个DataSet实例
2.调用DataSet的ReadXml方法,文件名作为参数
生成分层的父子数据
1.创建DataSet实例
2.添加相关DataTable,DataRelation等对象
3.将DataRelation.Nested属性设为TRUE
4.调用DataSet.WriteXml,生成XML内容
将DataSetColumn存储为一个基于XML的特性:
将DataColumn.ColumnMapping属性设置为MappingType.Attribute
补充内容 (2014-6-18 20:17):
学习笔记的第二部分(连接外部数据),放在4楼.
补充内容 (2014-6-18 20:20):
因字数限制,DataAdapter类的内容放在5楼. |
|