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

数据列 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() 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值