C# DataTable

C# DataTable

0、基础概念
  • DataSet 的定义:由表、关系和约束的集合组成。个人理解: DataSet是由多个DataTableDataTable之间的关系组成,如同小型的数据库。
  • DataTable表示一个内存内关系数据的表。个人理解:DaTable如同数据库中的表或Excel中的表,如我们常用的数据库如Mysql数据库,就是关系型数据库。

C# DataTable_第1张图片

  • 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、添加列
  • DataTable中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值

  • 通过调用表的 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; 

// 定义主键:唯一地标识表中的每一行
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"); 

C# DataTable_第2张图片

C# DataTable_第3张图片

C# DataTable_第4张图片

3、赋值
  • 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" });
4、查看数据表中的数据
  • 可以使用 DataTable 的 Rows 和 Columns 集合来访问 DataTable]中的内容。 也可以根据包括搜索条件、排序顺序和行状态在内的特定条件,使用 Select方法返回 DataTable 中数据的子集。 此外,在使用主键值搜索特定行时,还可以使用 DataRowCollection 的 Find 方法。
  • Select 方法返回 DataRow对象数组。 Select 接受筛选表达式、排序表达式。
//选择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");
5、删除行
//使用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,但是还存在,还可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);
}
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、参考文献

C# DataTable 详解-博客园
DataTable-微软官方文档

下一次,世界精彩处见!

你可能感兴趣的:(日常笔记,c#)