C#数据库开发读书笔记3---DataTable及表约束的应用

8、DataTable创建数据表

DataTable表示一个内存内关系数据的表,可以独立创建和使用,也可以由其他.NET框架对象使用,

最常见的情况是作为DataSet的成员使用。

DataTable对象可通过使用DataTable构造函数来创建,或者可通过将构造函数参数传递到DataSet

的Tables属性的Add方法来创建。

DataTable对象可通过使用DataAdapter对象的Fill方法或FillSchema方法在DataSet内创建,或者可使用

DataSet的ReadXml、ReadXmlSchema或InferXmlSchema方法从预定义的或推断的XML架构中创建。

将DataTable添加为一个DataSet的Tables集合的成员后,不能再将其添加至任何其他DataSet的表的集合。

//以下代码创建DataTable对象的实例,并为其指定名称"Customers"

DataTable workTable = new DataTable("Customers");

//以下代码创建DataTable实例,方法是:将其添加至DataSet的Tables集合。

DataSet custDS = new DataSet();

DataTable custTable = custDS.Tables.Add("CustTable");

8.1、定义数据表的架构

表的架构或结构由列和约束表示,使用DataColumn对象以及ForeignKeyConstraint和UniqueConstraint

对象定义DataTable的架构。表中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增

它们的值,或包含主键值。

8.1.1、在表中添加列

DataTable包含了由表的Columns属性引起的DataColumn对象的集合。这个列的集合与任何约束一起

定义表的架构或结构。

通过使用DataColumn构造函数,或者通过调用表的Columns属性的Add方法可以在表内创建DataColumn

对象。Add方法将接受可选的ColumnName、DataType和Expression参数,并将创建新的DataColumn

作为集合的成员。

//以下代码将4行添加到DataTable

DataTable workTable = new DataTable("Customers");

DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));

workCol.AllowDBNull = false;

workCol.Unique = true;

workTable.Columns.Add("CustLName", typeof(String));

workTable.Columns.Add("CustFName", typeof(String));

workTable.Columns.Add("Purchases", typeof(Double));

如果尚为给某个列提供列名,则将该列添加至DataColumnCollection时,该列会得到从"Columns"开始

递增的默认名称ColumnN。

8.1.2、创建表达式列

可以为列定义表达式,让它能够包含同一行中其它列值或表中多行的列值计算而得的值。

//实例代码

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

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

表达式可以引用其他表达式列,但循环引用(其中两个表达式相互引用)将产生异常。

8.1.3、创建Autoincrement列

要确保列中的值唯一,可将列值设置为在表中添加新行时自动递增。

//以下代码创建从200开始并以3为增量进行添加的列

DataColumn workColumn = workTable.Columns.Add("CustomerID", typeof(Int32));

workColumn.AutoIncrement = true;

workColumn.AutoIncrementSeed = 200;

workColumn.AutoIncrementStep = 3;

8.1.4、定义主键

在将一个单独的DataColumn标识为DataTable的PrimaryKey时,表会自动将列的AllowDBNull属性

设置为false,并将Unique属性设置为true。如果是多列主键,则只有AllowDBNull属性自动设置为false。

//示例代码

workTable.PrimaryKey = new DataColumn[]{workTable.Columns["CustID"]};

//或采用以下代码

DataColumn[] myColArray = new DataColumn[1];

myColArray[0] = workTable.Columns["CustID"];

workTable.PrimaryKey = myColArray;

//下面示例将两列定义为主键

workTable.PrimaryKey = new DataColumn[]{workTable.Columns["CustLName"],

workTable.Columns["CustFName"]};

//或者采用以下代码

DataColumn[] myKey = new DataColumn[2];

myKey[0] = workTable.Columns["CustLName"];

myKey[1] = workTable.Columns["CustFName"];

workTable.PrimaryKey = myKey;

8.1.5、添加约束

ADO.NET中有两种约束: ForeignKeyConstraint和UniqueConstraint。默认情况下,通

过将DataRelation添加至DataSet来创建两个或多个表之间的关系时,两种约束会自动创建。

但是也可以在创建关系时,通过指定createConstraints = false 禁用这一行为。

//外键

ForeignKeyConstraint可以限制并传播对相关列的更改。根据列的ForeignKeyConstraint属性,

并且如果DataSet的EnforceConstraints属性是 true ,对父行执行某些特定操作将会导致异常。

例如:如果ForeignKeyConstraint的DeleteRule属性是None,那么在父行有子行的情况下,则无法删除父行。

//示例代码

ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK");

custDS.Tables["CustTable"].Columns["CustomerID"],

custDS.Tables["OrdersTable"].Columns["CustomerID"]);

custOrderFK.DeleteRule = Rule.None;

//不能删除具有订单的顾客

custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

//唯一键

//以下代码为DataTable的两列创建UniqueConstraint

DataTable custTable = custDS.Tables["Customers"];

UniqueConstraint custUC = new UniqueConstraint(

new DataColumn[]{custTable.Columns["CustomerID"], custTable.Columns["CompanyName"]});

custDS.Tables["Customers"].Constraints.Add(custUC);

9、在数据表中操作数据

    9.1、将数据添至表中

添加新行可以声明一个DataRow类型的变量。调用NewRow方法,将返回新的DataRow对象。然后DataTable

会根据表的结构按DataColumnCollection的定义创建DataRow对象。

//示例代码

DataRow workRow = workTable.NewRow();

workRow["CustLName"] = "Smith";

workRow[1] = "Smith";

workTable.Rows.Add(workRow);

//也可以通过传入值得数组,调用Add方法来添加新行

workTable.Rows.Add(new Object[]{1, "Smith"});

注意: 将类型化为Object值得数组传递到Add方法,可在表内创建新行并将其列值设置为对象数组中的值,

数组中的值会根据它们在表中出现的顺序相继与各行匹配。

//以下示例将10行添加至新建的Customers表中

DataRow workRow;

for (int i = 0; i < 10; i++)

{

workRow = workTable.NewRow();

workRow[0] = i;

workRow[1] = "CustName" + i.ToString();

workTable.Rows.Add(workRow);

}

 9.2、查看表中数据

可以使用DataTable的Rows和Columns集合来访问DataTable中的内容。也可以根据包括搜索标准、排序顺序

和行状态等特定标准,使用DataTable.Select方法返回DataTable中数据的子集。此外,用主键值搜索特定

行时,还可使用DataRowCollection的Find方法。

DataTable对象的Select方法返回一组与指定条件匹配的DataRow对象。Select采用筛选表达式、

排序表达式和DataViewRowState的可选参数。筛选表达式根据DataColumn值(例如 LastName = ‘Smith‘),

排序表达式遵循用于为列排序的标准SQL约定,例如LastName ASC, FirstName ASC。

如果对DataTable的Select方法执行多次调用,可先为DataTable创建DataView来提高性能。创建DataView

会为表中的行编制索引。然后,Select方法会使用该索引,这样将显著缩短生成查询结果的时间。

时间: 2024-10-10 16:27:07

C#数据库开发读书笔记3---DataTable及表约束的应用的相关文章

C#数据库开发读书笔记1---数据库连接及DataReader的使用

1.ADO.NET结构: 两个核心组件:DataSet..NET数据提供程序(Connection.Command.DataReader和DataAdapter四个对象). DataSet是独立于任何数据源的数据访问,因此可用于多种不同的数据源,用于XML数据或独立于管理应用程序本地的数据:DataSet包含一个或多个DataTable对象的集合:DataSet和XML之间是相互兼容的. 2..NET数据提供程序: 2.1.Connection:提供与数据源的连接 2.2.Command:使用户

C#数据库开发读书笔记2---DataAdapter、DataSet的使用

6.DataAdapter的使用 .NET框架通过 DataAdapter 来控制与现有数据源的交互,每个 .NET 数据提供程序都包含一个 DataAdapter对象:OLE DB .NET 数据提供程序包含一个 OLEDBDataAdapter 对象, 而 SQL Server .NET 数据提供程序包含一个 SqlDataAdapter 对象. DataAdapter 对象用于从数据源中检索数据并填充 DataSet 中的表,并且还会将对 DataSet 作出的更改解析回数据源. Data

C#数据库开发读书笔记4---DataView的使用

1.创建DataView 创建DataView的方法有两种,可以使用DataView构造函数,也可以创建对DataTable的DefaultView属性 的引用.DataView构造函数可以为空,也可以通过单个参数的形式采用DataTable或者同时采用DataTable 与筛选条件.排序条件和行状态筛选器. 在创建DataView时或者在修改任何Sort.RowFilter或RowStateFilter属性时,都会生成DataView的索引, 所以当创建DataView时,通过以构造函数参数的

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflash或者nandflash:只好用另一块arm9(i.mx283a)来继续学习: 从开发教程上面可知,烧写uboot和Linux是通过各种批处理脚本和exe程序来执行的,称之为固件烧写,然而并没有需要我们选择uboot路径.Linux内核和文件系统的地方.这样的话是不是意味着只能烧写官方默认提供的文件

驱动开发读书笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇

驱动开发读书笔记. 0.04  linux 2.6 platform device register 平台设备注册  1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentation/driver-model/platform.txt Device Enumeration 82 ~~~~~~~~~~~~~~~~~~ 83 As a rule, platform specific (and often board-specific) setup code will 84 reg

驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识

驱动开发读书笔记. 0.06  嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB video class 或USB video device class.是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一. UVC linux driver: UVC linux 驱动 需要在编译内核的时候选上 配置内核 Device

驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇

驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇 下面这段摘自 linux源码里面的文档 : 内核版本2.6.22Documentation/driver-model/platform.txt找到一篇译文:http://blog.csdn.net/yili_xie/article/details/5193609 Device Enumeration 82 ~~~~~~~~~~~~~~~~~~ 83 As a rule

驱动开发读书笔记.0.00 从拿到一块开发板开始

当我们手上有一块arm开发板,我们应该怎么下手呢?(假设你有少许计算机和电子的基础) 1.01安装桌面版linux: 你可以装虚拟机 或者 双系统windows + linux [假装有链接] 1.如果你会重装系统,我建议你装双系统或直接ubuntu,end 2.如果你不会重装系统,跳到3 3.学会它,跳到1 1.02:开发板上装系统[链接以后再补] 烧boot 烧内核 烧文件系统 讲真,如果你看到这三个名词之后蒙圈了,请左拐去预习/复习操作系统 1.03 系统安装完成,开发板怎么和PC进行通信

《敏捷软件开发读书笔记之二》

接下来,我将向大家介绍第三部分“薪水支付案例研究”和第四部分“打包薪水支付系统”这两部分的认识,以及从中得到的收获: 以下是我从第三部分“薪水支付案例研究”中学到的相关知识以及个人的一些总结: Command模式的简单性掩盖了它的多功能性,此模式可以应用于多种能够不同的美妙用途,范围涉及数据库事物操作,设备控制,多线程核心以及GUI的Do/Undo管理,此模式是在实际的软件开发中是非常有用的. TEMPLATE METHOD模式和STRATEGY模式都可以用来分离高层的算法和低层的具体 实现细节