C# DataTable
0、基础概念
- DataSet 的定义:由表、关系和约束的集合组成。个人理解: DataSet是由多个DataTable及DataTable之间的关系组成,如同小型的数据库。
- DataTable表示一个内存内关系数据的表。个人理解:DaTable如同数据库中的表或Excel中的表,如我们常用的数据库如Mysql数据库,就是关系型数据库。
- DataTable的架构由列和约束表示。 使用对象以及 ForeignKeyConstraint 和 UniqueConstraint对象定义DataTable 的架构。DataTable中的列可以映射到数据源中的列,包含从表达式计算所得的值、自动递增它们的值,或包含主键值。除架构以外,DataTable 还必须具有行,在其中包含数据并对数据排序。DataRow类表示表中包含的实际数据。 DataRow 及其属性和方法用于检索、计算和处理表中的数据。在访问和更改行中的数据时,DataRow 对象会维护其当前状态和原始状态[1]。(与数据库中的表几乎一样)
1、创建DataTable
- 使用相应的 DataTable 构造函数创建 DataTable 对象
//引用命名空间
using System.Data;
//创建一个空表,
DataTable dt = new DataTable();
//创建一个名为"Table_New"的空表
DataTable dt = new DataTable("Table_New");
//在将一个没有 TableName 值的表添加到数据集DataSet中时,该表会得到一个从“Table”(表示 Table0)开始递增的默认名称 TableN
DataSet customers = new DataSet();
DataTable customersTable = customers.Tables.Add("CustomersTable"); // 这种方法在程序中很少用
2、列 DataColumn
- DataColumn类的官方文档
- DataTable.Columns 属性
- DataColumn 定义每列的数据类型来确定表的架构
- DataTable中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值
- DataColumn的DataType属性,可限制该列的数据类型为整数、字符串或十进制数等,但必须将数据类型与数据源中的数据类型匹配。
- 构造函数
DataColumn() | |
DataColumn(string ) | 指定的列名称 |
DataColumn(string,type) | 指定的列名称和类型 |
DataColumn(string,type,string) | 设置表达式计算该列的值 |
DataColumn taxColumn = new DataColumn();
taxColumn.DataType = System.Type.GetType("System.Decimal");
taxColumn.ColumnName = "tax";
taxColumn.Expression = "price * 0.0862";
totalColumn.Expression = "price + tax"; //可以自动计算
- 通过调用表的 Columns 属性的 Add 方法。Add 方法将接受可选的 ColumnName、DataType 和 Expression 参数,并将创建新的 DataColumn 作为集合的成员。
//1.创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
//2. 提供列名,并对列属性进行设置
DataTable workTable = new DataTable("Customers");
//带列名和类型名
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
// 对进行属性设置
workCol.AllowDBNull = false; //列的属性设置为不允许 DBNull 值
workCol.Unique = true; //值约束为唯一
workColumn.AutoIncrement = true; //在表中添加新行时自动递增
workColumn.AutoIncrementSeed = 200; //从值 200 开始并以 3 为增量递增的列
workColumn.AutoIncrementStep = 3;
column.DefaultValue = 25;
// 定义主键:唯一地标识表中的每一行
workTable.PrimaryKey = new DataColumn[] {workTable.Columns["CustID"]};
// Or
DataColumn[] columns = new DataColumn[1];
columns[0] = workTable.Columns["CustID"];
workTable.PrimaryKey = columns;
// 创建表达式列:能够包含根据 同一行 中其他列值或根据表中 多行 的列值计算而得的值
//比如 表达式类型 示例
// 比较 “总计 >= 500”
// 计算 "UnitPrice * Quantity"
// 聚合 Sum(Price)
workTable.Columns.Add("Total", typeof(Double));
workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086");
3、行 DataRow
- 微软官方文档DataRow类
- DataRow对象中每个值都表示表中的一行数据。 DataRow 及其属性和方法用于检索、计算、插入、删除和更新表中的数据。在访问和更改行中的数据时,DataRow 对象会维护其当前状态和原始状态
//新建行的赋值
DataRow dr = dt.NewRow();//创建新行
dr[0] = "张三";//通过索引赋值
dr["column1"] = DateTime.Now; //通过名称赋值
//对表已有行进行赋值
dt.Rows[0][0] = "张三"; //通过索引赋值
dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值
//将类型化为Object的值的数组,请注意,数组中的值会根据它们在表中出现的顺序相继与各列匹配
dt.Columns.Add("序号");
dt.Columns.Add("姓名");
dt.Rows.Add(new Object[] { 1, "Smith" });// 将DataRow添加到DataTable中
4、删除行
//使用DataTable.Rows.Remove(DataRow)方法
dt.Rows.Remove(dt.Rows[0]);
//使用DataTable.Rows.RemoveAt(index)方法
dt.Rows.RemoveAt(0);
//使用DataRow.Delete()方法
dt.Row[0].Delete();
dt.AcceptChanges();
//-----区别和注意点-----
//Remove()和RemoveAt()方法是直接删除
//Delete()方法只是将该行标记为deleted,但是还存在,当应用程序调用 AcceptChanges 方法时,才会发生实际的删除,还可DataTable.RejectChanges()回滚,使该行取消删除。
//用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。
//DataTable在修改行中存储的值时维护各个阶段的值,包括当前值、原始值和默认值。
//如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
dt.Rows.RemoveAt(i);
}
5、筛选数据表 Select()
- 可以使用 DataTable 的 Rows 和 Columns 集合来访问 DataTable]中的内容。 也可以根据包括搜索条件、排序顺序和行状态在内的特定条件,使用 Select方法返回 DataTable 中数据的子集。 此外,在使用主键值搜索特定行时,还可以使用 DataRowCollection 的 Find 方法。
- Select 方法返回 DataRow对象数组。 Select 接受筛选表达式、排序表达式。
Select() | 获取由所有 DataRow对象组成的数组。 |
Select(string) | 获取由与筛选条件匹配的所有 DataRow 对象组成的数组。 |
Select(string,string) | 以指定排序顺序,获取由与筛选条件匹配的所有 DataRow 对象组成的数组。 |
//选择column1列值为空的行的集合
DataRow[] drs = dt.Select("column1 is null");
//选择column0列值为"李四"的行的集合
DataRow[] drs = dt.Select("column0 = '李四'");
//筛选column0列值中有"张"的行的集合(模糊查询)
DataRow[] drs = dt.Select("column0 like '张%'");//如果的多条件筛选,可以加 and 或 or
//筛选column0列值中有"张"的行的集合并按column1降序排序
DataRow[] drs = dt.Select("column0 like '张%'", "column1 DESC");
// 将 DataRow[] 转换为DataTable
public DataTable ToDataTable(DataRow[] rows)
{
if (rows == null || rows.Length == 0) return new DataTable();
DataTable tmp = rows[0].Table.Clone(); // 复制DataRow的表结构
foreach (DataRow row in rows){
tmp.ImportRow(row); // 将DataRow添加到DataTable中
}
return tmp;
}
6、表格复制
//克隆表,只是复制了表结构,不包括数据
DataTable dtNew = new DataTable();
dtNew = dt.Clone();
//复制表,同时复制了表结构和表中的数据
DataTable dtNew = new DataTable();
dtNew = dt.Copy();
dtNew.Clear() //清空数据
dtNew.Rows.Clear();//清空表数据
dtNew.ImportRow(dt.Rows[0]);//将DataRow复制到DataTable中,保留任何属性设置以及初始值和当前值
7、DataView
- 可使DataTable 显示不同的数据
- 用于排序、筛选、搜索、编辑和导航
- DataView 类的属性、方法
- DataTable.DefaultView属性:可对DataTable进行排序、筛选和搜索
- DataView.Sort属性:获取或设置 DataView 的一个或多个排序列和排序顺序
view.Sort = "State ASC, ZipCode ASC";
- DataView.ToTable 方法
ToTable(bool distinct, params string[] columnNames) | 是否删除重复行,DataTable中包含的列 |
ToTable(string tableName) | |
ToTable(string tableName, bool distinct, params string[] columnNames) |
DataTable newTable = view.ToTable(true, "Category", "QuantityInStock");
DataTable newTable = view.ToTable("FilteredTable");
DataTable newTable = view.ToTable("UniqueData", true,
"Category", "QuantityInStock");
8、DataSet
- DataSet 类微软文档
- 是数据的一种内存驻留表示形式,无论它包含的数据来自什么数据源,都会提供一致的关系编程模型
- 表示整个数据集,其中包含对数据进行包含、排序和约束的表以及表间的关系
- 使用 DataSet 的方法有若干种,这些方法可以单独应用,也可以结合应用
- 以编程方式在 DataTable中创建 DataRelation、Constraint和 DataSet,并使用数据填充表。
- 通过 DataSet 用现有关系数据源中的数据表填充 DataAdapter。
- 使用 XML 加载和保持 DataSet 内容。
1.XML Web services 概述
- XML Web services 概述
- XML Web services 可通过标准接口进行访问,因此 XML Web services 允许多个异构系统作为单个计算网络协同工作
- XML Web services 使用基于 XML 的消息作为数据通信的基本方式,以帮助减少组件模型、操作系统和编程语言不一致的系统之间的差别
- XML Web services 通过将基于 XML 的消息用作服务的创建和访问机制,XML Web services 客户端和 XML Web services 提供程序只要相互知道输入、输出和位置,就不用再了解任何其他信息了。
- XMLWeb services 基础结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VO1N9Uqk-1662540589085)(https://ryangfeng.oss-cn-hangzhou.aliyuncs.com/typoraImage/sd5s0c6d.73071542-d74d-4f9c-a3c2-96afb3ccf0ca(zh-cn,vs.100)].gif)
s 提供程序只要相互知道输入、输出和位置,就不用再了解任何其他信息了。
- XMLWeb services 基础结构
9、参考文献
下一次,世界精彩处见!