数据集概述
1.1数据集
l 是一种代表关系数据的内存驻留结构
l 是以XML 形式表示的数据视图,是一种数据关系视图。
l 在Visual Studio 和.NET Framework 中,XML 是存储和传输各种数据时所用的格式。因此,数据集与XML 有密切关系。
1.2数据集分类
– 类型化数据集
– 非类型化数据集
1.3类型化数据集和非类型化数据集的区别
结构体系
功能类型
检测
类型化数据集
类型化数据集这样一种数据集,它先从基DataSet 类派生,然后,使用XML 架构文件(.xsd 文件)中的信息生成新类。架构中的信息(表、列等)被作为一组第一类对象和属性生成并编译为此新数据集类。
可以直接通过名称
引用表和列
在VS.NET中可以智能感知元素的类型
非类型化数据
集
非类型化数据集没有相应的内置架构。与类型化数据集一样,非类型化数据集也包含表、列等,但它们只作为集合公开。
需要通过Tables集
合引用列
不能感知
1.4 数据集的属性
重点:
– Tables
– Relations
创建数据集和数据表
2.1创建数据集:
– 设计时创建非类型化数据集
工具箱“数据”
– 运行时创建非类型化数据集
2.2 创建数据表
• 数据表属性
–最重要的集合:
• Columns
• Rows
• Constraints
• 给数据集添加数据表
[参考代码]
//创建数据集
DataSet ds = new DataSet("myDS");
DataTable dsMaster = new DataTable("master");
DataTable dsChild = new DataTable("child");
ds.Tables.Add(dsMaster);
ds.Tables.Add(dsChild);
2.3 为数据表添加列
• Columns集合属性
• 为数据表添加列
2.4 为数据表添加行
• Rows属性
• Rows.Add方法
– Add(DataRow):向数据表中添加指定的数据行
• 为数据表添加行
[参考代码]
//添加列
ds.Tables["master"].Columns.Add("masterID", typeof(Int32));
//添加行
DataRow dr = ds.Tables["master"].NewRow();
dr["masterID"] = "";
ds.Tables["master"].Rows.Add(dr);
//修改表头
ds.Tables["master"].Columns["masterID"].Caption = "主ID";
2.5 为数据表添加约束
• ForeignKeyConstraints属性:保证两个数据表之间对应行改变时的关系
• UniqueConstraints属性:保证某列数据在每行都不相同
• 在运行时为数据表添加约束
–添加外键约束:修改一个表的值看是否变化
–添加唯一键约束
2.6 为数据集添加关系
• Relations:定义数据表之间的关系,该集合中可以包含0个或者多个数据关系对象,每个对象表示
两个表之间的关系
• 只有数据集的EnforeConstraints属性设置为true时,DataRelation中建立的约束才会被强制执行
• 为数据表添加数据关系(非类型数据集)
[参考代码]
//添加唯一键
System.Data.UniqueConstraint uc = new UniqueConstraint("唯一键名称",ds.Tables["master"].Columns["masterID"]);
//添加外键
System.Data.ForeignKeyConstraint fc = new ForeignKeyConstraint("外键名称", "主表列", "从表列");
//添加关系
ds.Relations.Add("关系名","父表列","子表列");
//注意关系和外键的区别
if (ds.Relations.Count <= 0)
return ;
System.Data.DataRow dr = ds.Tables["master"].Rows[0];
System.Data.DataRow[] drArray = dr.GetChildRows(ds.Relations[0]);
//这里的区别在于 外键:如果主表列更新,则从表列都对应更新
//关系:能够从父表对应的一列,获取子表对应的行集
2.7 显示行状态
• 数据行的RowState属性反映了自数据表创建以来或者上次更新后在数据表上采取的操作
• DataRowState的取值
• 显示状态行
[参考代码]
//显示行状态
DataRowState drs = ds.Tables["master"].Rows[0].RowState;
数据操作
3.1数据集方法
– 克隆数据集:只复制结构
DataSet.Clone ();
– 复制数据集:复制结构和数据
DataSet.Copy ();
3.2数据表方法
– Select方法:用于在运行时过滤数据表的行并进行排序。它不对表的内容作改动。该方法只是返回与指定的规则相匹配的行数组
//返回DataRow[]集合
DataSet.Tables["master"].Select(“条件”,”排序规则”);
数据集内的筛选与排序
在填充数据集之后,通常会发现使用表中的不同记录子集或以不同顺序查看数据很有用。可以通过对数据集内的数据进行筛选和排序来实现这一点。若要简化此过程,可以创建数据视图,数据视图提供可合并筛选器和排序条件的对象,可用作数据绑定的源
数据集内的筛选与排序
可改用内置的数据集功能来筛选和排序。有两个选择:
• 数据表支持Select 方法,您可调用该方法来筛选和排序。该方法并不更改表中记录的内容和顺序,相反,它向您提供一个记录列表(或数组)表示所指定的条件。
• 可以使用数据视图(DataView 对象)。数据视图是一个对象,它作为数据表之上的层,提供经过筛选和排序后的表内容视图。(还可以使用数据视图管理器,它的行为像数据视图集合。)数据视图类似于数据库中的视图,因为它不是数据的副本。相反,它只是查看表中数据的另一种方式。
4.1 数据视图概述
• 数据视图是位于数据表之上的独立对象
• 数据视图是对单一数据进行过滤和排序后的视图
• 可以用作绑定控件的数据源
• 可以为一个数据表创建多个数据视图
• 视图数据行实际引用了数据行的DataRowView对象
DataRowView的属性
属性
描述
DataView
该数据行视图所属的数据视图
IsEdit
表示该数据行视图是否正在被编辑
IsNew
表示该数据行视图是否为新建
Item
该数据行视图中某列的值
Row
正在被查看的数据行
RowVersion
该数据行视图的当前版本
4.2 创建数据视图
• 在设计时创建
–创建类型化数据集
–从工具箱“数据”中选择“DataView”控件
• 可以使用表的DefaultView 属性来访问该默认数据视图,该数据视图返回一个
DataView 对象。可在运行时设置默认数据视图的属性。
4.3 数据视图的属性
• 数据视图属性
– RowFilter
– RowStateFilter
– Sort
• 使用表的Select 方法或数据视图的RowFilter 属性,可以筛选数据表中的记录以便仅使想操作的记录可用。这在要操作数据集表中记录的不同子集时很有用。若要指定筛选器条件,可以使用与创建列表达式所用语法相同的表达式语法。
[参考代码]
//RowFilter判断
string tempid = this.lbdid.Text.ToString();
bookView.RowFilter = "id='" + tempid + "'";
if (bookView.Count==1)
{
Response.Write("<script langusge='javascript'>alert('。。。');</script>");
return;
}
//RowStateFilter判断
DataView dwMain = (DataView)Session["cart"];
dwMain.RowFilter = this.tbCon.Text;
switch (ddlState.SelectItem.Value)
{
case "CurrentRows":
dwMain.RowFilter = DataViewRowState.CurrentRows;
break;
case "OriginalRows":
dwMain.RowFilter = DataViewRowState.OriginalRows;
break;
case "Added":
dwMain.RowFilter = DataViewRowState.Added;
break;
case "Unchanged":
dwMain.RowFilter = DataViewRowState.Unchanged;
break;
case "ModifiedCurrent":
dwMain.RowFilter = DataViewRowState.ModifiedCurrent;
break;
default:
break;
}
数据列表达式
• 是一个字符串,可以使用任何一个普通字符串处理函数来生成
• 算术运算符:+,-,*,/,%
• 比较运算符:AND,OR,<,>,<=,>=,<>
– IN:确定指定值是否包含在一个集合中
• myExpression= “myColumnIN ( ‘a’,’b’,’c’)”
– Like:用通配符进行模糊匹配
• 函数
4.4 数据视图的方法
方法
描述
AddNew
向数据视图中添加一个新的数据行视图
Delete
从数据视图中删除一个数据行视图
Find
根据指定的主键查找包含该主键的数据行视图
Find方法
• 按指定的排序关键字值在DataView 中查找行。
[参考代码]
//向数据视图添加行
DataRowView drv;
drv = dwMain.AddNew();
drv[".."] = "..";
//省略,不需要再Add
//删除
dwMain.Delete(dwMain.Count - 1);
//更新
dwMain[dwMain.Count - 1]["列名"] = "";
//查找,返回检索行数
dwMain.Find("关键字");
数据集实用技巧
• EXCEL和DataSet
[参考代码]
//注意添加名字空间using System.Data.OleDb;
#region 从Excel导入DataSet
string strConn = "Provider=Microsoft.Jet.OLEDB4.0"+
"Data Source="+strFillName+";"+
"Extended Properties =Excel8.0";
OleDbDataAdapter ExcelDa = new OleDbDataAdapter("select * from [sheet1$]", strnConn);
DataSet ExcelDs = new DataSet();
try
{
ExcelDa.Fill(ExcelDs, "excelInfo");
}
catch(Exception err)
{
//进行错误处理
}
#endregion
#region 从DataSet导入Excel
//首先要添加COM组件:添加引用-Com组件-Microsoft Excel 11.0-选择'确认
Excel.Application excel = new Excel.Application();
int rowIndex = 1;
int colIndex = 0;
excel.Application.Workbooks.Add(true);
System.Data.DataTable tb = ds.Tables[0];
foreach(DataColumn col in tb.Columns)
{
colIndex++;
//获取列名称
excel.Cells[1, colIndex] = col.ColumnName;
}
foreach (DataRow row in tb.Rows)
{
//添加数据
rowIndex++;
colIndex = 0;
foreach (DataColumn col in tb.Columns)
{
colIndex++;
excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
}
excel.Visible = false;
excel.ActiveWorkbook.SaveAs(....);
excel.Quit();
excel=null;
GC.Collect();//垃圾回收
#endregion
• XML和DataSet
[参考代码]
DataSet ds = new DataSet();
//Schelma尽量要单独载入,否则解析效率很低
ds.ReadXml("...");
ds.WriteXml("..");
• BLOB和DataSet