DataTable 是 ADO.NET 库中的核心类。其他使用 DataTable 的对象包括 DataSet 和 DataView。

1、DataTable特点

(1)DataTable 对象是按条件区分大小写的。(如果有两个 DataTable对象分别为“mydatatable”和“Mydatatable”,则搜索表的字符串被认为是区分大小写的。如果只有“mydatatable”而不存在“Mydatatable”,则该搜索表的字符串不区分大小写)。

(2)以编程方式创建 DataTable,须先通过将 DataColumn 对象添加到 DataColumnCollection(通过 Columns 属性访问)中来定义其架构。

(3)向 DataTable 添加行,须使用 NewRow 方法返回新的 DataRow 对象。(DataTable 可存储的最大行数是 16,777,216)。

(4)DataTable 也包含可用于确保数据完整性的 Constraint 对象的集合

(5)DataTable 事件(RowChanged、RowChanging、RowDeleting 和 RowDeleted)可用于确定对表进行更改的时间。

2、添加列

通过使用 DataColumn 构造函数,或通过调用表的 Columns 属性的 Add 方法。 由于 DataTable 对象不特定于任何数据源,所以在指定 DataColumn 的数据类型时会使用 .NET Framework 类型。

可以使用DataColumn的DataType属性来设置或查看列将包含的数据类型。在数据添加到 DataTable对象的Rows集合之前,DataColumn对象的DataType属性是可读的。数据库的数据类型同DataColumn的数据类型不是一一映射的。

DataColumn的DataType属性默认为字符串,此外,DataColumn还包含一个构造函数,可以指定数据类型和所创建的新列的名称。同样,重载DataColumn集合对象的Add方法可以允许为新建DataTable对象和新建DataColumn对象的ColumnName和DataType属性赋值。

(1)添加列

DataTable workTable = new DataTable("Customers");
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
workCol.AllowDBNull = false;//不允许 DBNull 值
workCol.Unique = true;//值约束为唯一
workTable.Columns.Add("CustLName", typeof(String));

(2)添加表达式列

可以为列定义表达式,让它能够包含根据同一行中其他列值或根据表中多行的列值计算而得的值。 要定义要计算的表达式,可使用目标列的 Expression 属性,并使用 ColumnName 属性在表达式中引用其他列。 用于表达式列的 DataType 必须适合于表达式将返回的值。

workTable.Columns.Add("Total", typeof(Double)); workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086");

(3)添加 AutoIncrement 列

要确保列值的唯一,可将列值设置为在表中添加新行时自动递增。 要创建自动递增的 DataColumn,可将列的 AutoIncrement 属性设置为 true。 然后,DataColumn 将从 AutoIncrementSeed 属性中定义的值开始,并且每添加一行,AutoIncrement 列的值将按列的 AutoIncrementStep 属性中定义的值增加。

对于 AutoIncrement 列,将 DataColumn 的 ReadOnly 属性设置为 true

DataColumn workColumn = workTable.Columns.Add(
"CustomerID", typeof(Int32));
workColumn.AutoIncrement = true;
workColumn.AutoIncrementSeed = 200;
workColumn.AutoIncrementStep = 3;

3、添加数据

将新变量声明为 DataRow 类型。调用 NewRow 方法时,将返回新的 DataRow 对象。 然后,DataTable 会根据 DataColumnCollection 定义的表结构创建 DataRow 对象。

DataRow workRow;
for (int i = 0; i <= 9; i++)
{
workRow = workTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workTable.Rows.Add(workRow);
}

4、添加约束

(1)添加主键

在将一个单独的 DataColumn 标识为 DataTable 的 PrimaryKey 时,表会自动将列的 AllowDBNull 属性设置为 false,并将 Unique 属性设置为 true。 如果是多列主键,则只有 AllowDBNull 属性自动设置为 false。DataTable 的 PrimaryKey 属性会将一个或多个 DataColumn 对象的数组接收为它的值.

workTable.PrimaryKey = new DataColumn[] {workTable.Columns["CustLName"], workTable.Columns["CustFName"]};// OrDataColumn[] keyColumn = new DataColumn[2];
keyColumn[0] = workTable.Columns["CustLName"];
keyColumn[1] = workTable.Columns["CustFName"];
workTable.PrimaryKey = keyColumn;

(2)添加外键

ForeignKeyConstraint 强制使用有关如何对相关表所做更新和删除进行传播的规则。 例如,如果更新或删除了一个表的某行中的值,并且一个或多个相关的表中也使用了同样的值,ForeignKeyConstraint 会决定相关表中发生的操作。

Cascade 删除或更新相关的行。

SetNull  将相关行中的值设置为 DBNull。

SetDefault  将相关行中的值设置为默认值。

None  对相关行不执行任何操作。 这是默认设置。

ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

(3)AcceptRejectRule

可使用 AcceptChanges 方法接受对行的更改,或者使用 DataSet、DataTable 或 DataRow 的 RejectChanges 方法取消对行的更改。 DataSet 包含 ForeignKeyConstraints 时,调用 AcceptChanges 或 RejectChanges 方法会强制使用 AcceptRejectRule。 ForeignKeyConstraint 的 AcceptRejectRule 属性决定了对父行调用 AcceptChanges 或 RejectChanges 时要对子行执行的操作。

AcceptRejectRule 的可用设置。

Cascade 接受或拒绝对子行的更改。

无   对子行不执行任何操作。 这是默认设置。

UniqueConstraint 对象(可分配给 DataTable 中的单独一列或一组列)确保指定的某列或多个列中的所有数据对于每行都是唯一的。 通过使用 UniqueConstraint 构造函数,可以为一列或一组列创建唯一的约束。 将生成的 UniqueConstraint 对象传递给该表的 Constraints 属性的 Add 方法,该属性是一个 ConstraintCollection。 还可以将构造函数参数传递给 ConstraintCollection 的 Add 方法的几个重载,以创建 UniqueConstraint。 为一列或多列创建 UniqueConstraint 时,可以选择指定此列或这些列是不是主键。

还可以通过将列的 Unique 属性设置为 true,为某列创建唯一约束。 或者,通过将单列的 Unique 属性设置为 false,可移除可能存在的任何唯一约束。 如果将一列或多列定义为表的主键,会自动为一个或多个指定的列创建唯一的约束。 如果从 DataTable 的 PrimaryKey 属性中移除一列,则 UniqueConstraint 也被移除。

DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[]
{custTable.Columns["CustomerID"],
custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUnique);

DataTable 类(一)表结果操作相关推荐

  1. C#操作DataTable类

    一.DataTable简介 (1)构造函数 名称 说明 DataTable()  不带参数初始化DataTable 类的新实例 DataTable(string tableName) 用指定的表名初始 ...

  2. 001 spring5框架:java类工程,IOC:实体类表示表关系,AOP,JdbcTemplate模板,事务操作,Spring5 框架新功能:日志,为空注解,函数式风格,juint,Webflux

    1. Spring5 框架(Spring5 Framework)介绍 1.1 概念 1.Spring 是轻量级的开源的 JavaEE 框架 2.Spring 可以解决企业应用开发的复杂性 3.Spri ...

  3. 《项目经验》--简单三层使用DataTable向数据库表批量导入数据---向SqlServer多张张表中导入数据

    前面已经介绍过如何向数据库的一张表中批量导入数据,详情见博客<项目经验---简单三层使用DataTable向数据库表批量导入数据---向SqlServer一张表中导入数据>:本文主要介绍如 ...

  4. Mybatis入门:4(多表查询操作)

    多表查询操作 Mybatis的多表操作 表之间的关系有几种:一对多.一对一.多对一.多对多 举例: 用户和订单就是一对多--一个用户可以下多个订单 订单和用户就是多对一--多个订单属于同一个用户 人和 ...

  5. 功能点分析:商品类目表

    前言 作为电商网站,必然要有商品类目表,以便商品分类检索.而设计商品类目表,又是一件特别繁杂的事情.一件商品可能有多个类目来检索出来,比如苹果手机,可以从品牌检索也可以从手机检索.一个类目对应多个商品 ...

  6. Django框架(3.django设计模型类、模型类生成表、ORM框架简介)

    ORM框架简介 O是object,也就类对象的意思, R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思, M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进 ...

  7. 3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束

     1 连接MYSQL服务器:mysql–uroot –p123456 查看中文问题 show variables like 'character%'; 2 修改mysql的字符集,退出mysql提 ...

  8. mfc搜索新建access字段_MFC ODBC类 Access数据库的操作

    MFC ODBC类 Access数据库的操作 2008年11月17日 新建一个Access数据库,数据库名是data.mdb新建一个表Ttest,两个字段ID,name 表内容如下 ID name 1 ...

  9. 实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作

    转载自  实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作 供稿 | eBay ADI-Carmel Team 作者 | 金澜涛 编辑 | 顾欣怡 本文7309字,预计阅读时 ...

  10. Origin使用手册/笔记第一部分:工作表行列操作

    目录 1:认识工作表 2:工作表行操作 (1)选中行 (2)插入行 (3)设置行高 3:工作表列操作 (1)添加列 (2)插入列 (3)移动列 (4)交换列 (5)删除列 (6)设置列属性 (7)快速 ...

最新文章

  1. 用脑科学支持人工智能
  2. mysql 分组取最新的一条记录(整条记录)
  3. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
  4. 【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...
  5. 从零单排学Redis【铂金一】
  6. VTK:Utilities之ShallowCopy
  7. django中实现websocket
  8. CSDN写博客(字体颜色、大小)
  9. Find the most comfortable road(HDU-1598)
  10. CentOS6.X安装QQ2012
  11. 机器学习8/100天-Logistic回归原理与实现
  12. Win10系统 如何查看win10版本类型及版本号
  13. 关于IEnumeratorT泛型枚举器 和 IEnumerableT
  14. oracle awr报告 开关,【Oracle之AWR报告解析】
  15. 产品经理学项目管理04:企业管理金字塔
  16. 【翻译】 Unity3D VR 教程:4.VR中的用户界面
  17. 关于JS如何实现图片闪烁
  18. 2022年系统集成项目管理工程师考试知识点:项目成本管理
  19. 解决win10状态栏的搜索框无法搜索本地应用或无反应
  20. discuz论坛中,如何上传并插入一段本地视频,并支持实时展示、实时播放

热门文章

  1. Asp.net禁用页面缓存的方法总结
  2. 3、InterruptedException
  3. Windows Phone 8初学者开发—第6部分:设置应用程序的样式
  4. linux下修改当前目录下图像文件并删除
  5. 字符串匹配BF/RK/BM/KMP算法
  6. G1垃圾收集器深度剖析
  7. 关于c语言编写 顺序表 的创建、插入、修改、删除、显示、退出 的程序案例
  8. python2 python3共存导致conda报错_Windows运维之Windows10下配置Python2和Python3共存 并用anaconda实现方便的包管理...
  9. Java企业面试算法新得体会之4递归和动态规划问题17问
  10. spl_autoload_register 注册自己的自动加载函数(__autoload())