您的位置:首页 > 其它

A-dataset、dataview、 datatable、 datacolum、datarow的关系

2008-02-03 15:48 543 查看
本文多来自网上搜集

数据集DataSet

DataSet 由表、关系和约束的集合组成。在 ADO.NET 中,DataTable 对象用于表示 DataSet 中的表。DataTable 表示一个内存内关系数据的表;数据对于所处的基于 .NET 的应用程序来说是本地数据,但可从数据源(例如,使用 DataAdapter 的 Microsoft SQL Server)中导入。

DataSet类是数据的脱机容器。它不包含数据库连接的概念,实际上存储在DataSet中的数据不一定来源于数据库,它可以是CSV文件中的记录,或是来自测量设备中的点读取。
数据集由一组数据表组成,每个表都有一些数据列和数据行。除了定义数据外,还可以在DataSet中定义表之间的链接。例如,我们常常要定义父/子关系(通常也称为主/从关系)。表中的一个记录(即Order)链接到另一个表的许多记录上(即Order_Details),这种关系可以在DataSet中定义和导航,如图21-4所示。



图 21-4
下一节描述和DataSet一起使用的类。

数据表DataTable
DataTable 类是 .NET Framework 类库中 System.Data 命名空间的成员。您可以独立创建和使用 DataTable,也可以作为 DataSet 的成员创建和使用,而且 DataTable 对象也可以与其他 .NET Framework 对象(包括 DataView)一起使用。您可以通过 DataSet 对象的 Tables 属性来访问 DataSet 中表的集合。

数据表非常类似于物理数据库表,它由一些带有特定属性的列组成,可能包含0行或多行数据。数据表也可以定义主键码(可以是一个列或多个列),列上也可以包含约束。这些信息在本章的其他部分称为“模式”。
为数据表定义模式有几种方式(把数据集当作一个整体),这些在介绍了数据列和数据行后讨论。图21-5显示了一些可通过数据表访问的对象。



图 21-5
DataTable对象(和DataColumn)可以附带任意多个扩展属性。这个集合可以用附属于对象的用户自定义信息来填充。例如,某个列有一个输入掩码,用于验证列的内容是否有效,比较规范的示例是US社会安全号。当数据在中间层中构造,要返回给客户机,进行某些处理时,最适合使用扩展的属性。例如,可以在扩展的属性(如min和max)中存储数字列的有效性标准,在验证用户输入时在UI层使用它们。
填充数据表时,可以从数据库中选择数据,从文件中读取数据,或在代码中手工填充,Rows集合会包含这些检索出来的数据。
Columns集合包含已经添加到表中的DataColumn实例,它们定义了数据的模式,例如数据类型、是否可为空和默认值等。Constraints集合可以用惟一或主键码约束来填充。
数据表使用模式信息的一个示例是在DataGrid(详见第22章)中显示数据。DataGrid控件使用属性(例如列的数据类型)来确定该列应使用什么控件。数据库中的bit列在DataGrid中显示为一个复选框。如果列在数据库模式中定义为NOT NULL,那么该列就存储在DataColumn中,以便在用户试图移出数据行时测试该列。
表的架构或结构由列和约束表示。使用 DataColumn 对象以及 ForeignKeyConstraint 和 UniqueConstraint 对象定义 DataTable 的架构。表中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值。

2007-06-25 16:09

数据列DataColumn

DataColumn对象定义了数据表中某列的属性,例如该列的数据类型,该列是否为只读,以及其他属性。列可以在代码中创建,或者由运行库自动生成。

在创建一个列时,给它指定名称是很有用的,否则运行库就会为该列生成一个名称,其格式是Columnn,其中n是一个递增的数字。

列的数据类型可以在构造函数中提供,也可以通过设置DataType属性来指定。把数据加载到数据表中后,就不能改变列的数据类型了,否则会抛出ArgumentException异常。

创建的数据列可以包含表21-3所示的.NET Framework数据类型。

表 21-3

Boolean
Decimal
Int64
TimeSpan
Byte
Double
Sbyte
UInt16
Char
Int16
Single
UInt32
DateTime
Int32
String
UInt64
一旦创建好,就要给DataColumn对象设置其他属性,例如该列是否可为空或者设置默认值。下面的代码段显示了给DataColumn设置的一些常见选项:
DataColumn customerID = new DataColumn("CustomerID" , typeof(int));
customerID.AllowDBNull = false;
customerID.ReadOnly = false;
customerID.AutoIncrement = true;
customerID.AutoIncrementSeed = 1000;
DataColumn name = new DataColumn("Name" , typeof(string));
name.AllowDBNull = false;
name.Unique = true;
可以给DataColumn设置如表21-4所示的属性。

表 21-4

属 性
说 明
AllowDBNull
如果为true,该列就可以设置为DBNull
AutoIncrement
定义自动生成的列值为一个递增的数字
AutoIncrementSeed
定义AutoIncrement列最初的种子值
AutoIncrementStep
用默认的步骤定义自动生成列值的步骤
Caption
可以用于在屏幕上显示列名
ColumnMapping
指定当DataSet通过调用DataSet.WriteXml来保存时,列如何映射到XML上
ColumnName
列名。如果没有在构造函数中设置,就由运行库自动生成
DataType
列的System.Type值
DefaultValue
可以定义列的默认值
Expression
该属性定义表达式用于所计算的列
数据行DataRow

这个类构成了DataTable类的另一部分。数据表中的列根据DataTable类来定义,表中的实际数据用DataRow对象来访问。下面的示例说明了如何访问数据表中的行。首先是连接:

string source = "server=(local)//NetSDK;" +
"uid=QSUser;pwd=QSPassword;" +
"database=northwind";
string select = "SELECT ContactName,CompanyName FROM Customers";
SqlConnection conn = new SqlConnection(source);
下面的代码显示了SqlDataAdapter类,它用于选择DataSet中的数据。SqlDataAdapter使用SQL子句,在DataSet中用下面查询的结果填写表Customers。将在21.7节中进一步讨论SqlDataAdapter类。

SqlDataAdapter da = new SqlDataAdapter(select, conn);
DataSet ds = new DataSet();
da.Fill(ds , "Customers");
在下面的代码中注意,使用DataRow的索引器访问数据行上的值。给定列的值可以用几个重载的索引器来检索,这样就可以通过已知的列号、列名或DataColum来检索数据的值:

foreach(DataRow row in ds.Tables["Customers"].Rows)
Console.WriteLine("'{0}' from {1}" , row[0] ,row[1]);
DataRow最吸引人的一个方面就是它的版本功能。DataRow可以接收某一行上指定列的各个值,其版本见表21-5。

表 21-5

DataRow的Version值
说 明
Current
列中目前存在的值,如果没有进行编辑,该值与初值相同。如果进行了编辑,该值就是最后输入的一个有效值
Default
默认值(列的任何默认设置)
Original
最初从数据库中选择出来的列值。如果调用了DataRow的AcceptChanges方法,该值就更新为当前值
Proposed
对列进行逐步的修改时,可以检索到这个已改变的值。如果在行上调用了方法BeginEdit(),并进行了修改,每一列都会有一个推荐值,直到调用了EndEdit()或CancelEdit()为止
可以以许多方式使用给定列的版本。例如,在数据库中更新数据行时,常常使用如下SQL语句:

UPDATE Products
SET Name = Column.Current
WHERE ProductID = xxx
AND Name = Column.Original;
显然,这段代码永远不会编译,但它说明了列的初值和当前值的一个用法。

要从DataRow索引器中检索某个版本的值,应使用索引器方法,把DataRowVersion值作为一个参数。下面的代码段说明了如何获得DataTable中每一列的所有值:

foreach (DataRow row in ds.Tables["Customers"].Rows )
{
foreach ( DataColumn dc in ds.Tables["Customers"].Columns )
{
Console.WriteLine ("{0} Current = {1}" , dc.ColumnName ,
row[dc,DataRowVersion.Current]);
Console.WriteLine (" Default = {0}" , row[dc,DataRowVersion.Default]);
Console.WriteLine (" Original = {0}" , row[dc,DataRowVersion.Original]);
}
}
整个数据行有一个状态标志RowState,可以用于确定在返回数据库时需要对该行进行什么操作。RowState标志跟踪对DataTable所作的所有改变,例如添加新行、删除现有的行,改变表中的列。当数据与数据库保持一致时,行的状态标志用于确定应执行什么SQL操作。这些标志由DataRowState枚举定义,如表21-6所示。

表 21-6

DataRowState值
说 明
Added
把新数据行添加到DataTable的Rows集合中。在客户机中创建的所有行都设置为这个值,最终在与数据库保持一致时,会使用SQL INSERT语句
Deleted
通过DataRow.Delete()方法把DataTable中的数据行标记为删除。该行仍存在DataTable中,但在屏幕上看不到它(除非显式设置DataView)。DataView在下一章讨论。在DataTable 中标记为已删除的Rows将在与数据库保持一致时从数据库中删除
Detached
数据行在创建后立即显示为这个状态,调用DataRow.Remove()也可以返回这个状态。分立的行不是任何DataTable的一部分,因此处于这种状态的行不能使用任何SQL语句
Modified
如果列中的值发生了改变,就会修改一行数据
Unchanged
自从最后一次调用AcceptChanges以来,数据行都没有发生改变
行的状态也取决于在其上调用的方法。一般在成功更新数据源(即把改变返回数据库后)之后调用AcceptChanges方法。

修改DataRow中数据最常见的方式是使用索引器,但如果对数据进行了许多修改,就需要考虑使用BeginEdit() 和 EndEdit()方法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: