DataSet对象

6.6 各对象参考
6.6.1 DataSet对象的属性
CaseSensitive
DataSetName
DesignMode
EnforceConstraints
ExtendedProperties
HasErrors
Locale
Namespace
Prefix
Relations
Tables
6.6.2 DataSet对象的方法
AcceptChanges
RowState 的属性值为Added 或Modified 的所有行的RowState 属性将会被设置为Unchanged 。这样做也会将DataRow 的当前值重置为原始值。任何标记为Deleted 的DataRow对象在调用AcceptChanges时将会被删除。
DataAdapter 对象成功地提交存储在DataRow 对象中的挂起更改时,它也隐式地对该DataRow 调用了AcceptChanges
BeginInit
Clear
Clone
Copy
EndInit
GetChanges
GetXml
GetXmlSchema
HasChanges
InferXmlSchema
Merge
ReadXml
ReadXmlSchema
RejectChanges
Reset
WriteXml
WriteXmlSchema
6.6.3 DataSet对象的事件
MergeFailed
6.6.4 DataTable对象的属性
CaseSensitive
ChildRelations
ParentRelations
ChildRelations 属性和ParentRelations 属性允许您查看当前DataTable 中包含子关系或父关系的DataRelation 对象。
假设您正在处理分级的Customer 数据,Order 数据和OrderDetails 数据,并引用了一个包含Order 信息的DataTable ,那么ParentRelations 集合将会包含关联Order DataTable 和Customer DataTable 的DataRelation 对象;ChildRelations 将会包含涉及Order DataTable 和OrderDetails DataTable 的DataRelation 对象。
Columns
Constraints
DataSet
DefaultView
如果您为DataTable绑定一个控件,则该控件实际绑定到DataTable的 DefaultView 属性上。例如,可以用下面的代码来应用过滤器,使得在绑定到DataTable的DataGrid中只显示来自西班牙的客户,DataTable仍包含所有的客户。
tblCustomers.DefaultView.RowFilter = "Country = 'Spain'";
gridCustomers.DataSource = tblCustomers;
DesignMode
ExtendedProperties
HasErrors
Locale
MinimumCapacity
如果大概知道DataTable包含的行数,那么在将结果填充到DataTable前设置DataTable对象的MinimumCapacity属性可以起到增强代码性能的结果。
MinimumCapacity默认为50
Namespace
Prefix
PrimaryKey
2个作用,一个是作为唯一约束,另一个是使用DataTable的Rows集合的Find方法还可以根据DataRow中的主键在DataTable中定位在DataRow。
Rows
TableName
6.6.5 DataTable对象的方法
AcceptChanges
BeginInit
BeginLoadData
如果要将一组DataRow对象添加到DataTable对象中,那么使用BeginLoadData和EndLoadData方法也许能够改进性能。
调用BeginLoadData会关闭DataTable的约束,调用EndLoadData将恢复约束。如果DataTable包含破坏约束的行,那么在调用EndLoadData时会出现ConstraintException。要确定引发异常的行可查看GetErrors方法返回的行。
Clear
Clone
Compute
可以使用该方法在特定查询规则基础上执行对DataTable中某一列的聚合查询。
下面代码介绍了使用Compute方法来计算包含chai的定单数。代码还计算订购chai的单位总数:
string strSQL, strConn;
strConn = "Provider=SQLOLEDB;Data Source=(local)//NetSDK;" +
          "Initial Catalog=Northwind;Trusted_Connection=Yes;";
strSQL = "SELECT OrderID, ProductID, Quantity FROM [Order Details]";
OleDbDataAdapter da = new OleDbDataAdapter(strSQL, strConn);
DataTable tbl = new DataTable("Order Details");
da.Fill(tbl);
int intNumChaiOrders;
Int64 intNumChaiUnits;
intNumChaiOrders = (int) tbl.Compute("COUNT(OrderID)", 
                                     "ProductID = 1");
intNumChaiUnits = (Int64) tbl.Compute("SUM(Quantity)", 
                                      "ProductID = 1");
Console.WriteLine("# of orders that include chai: " + 
                  intNumChaiOrders);
Console.WriteLine("Total number of units ordered: " + 
                  intNumChaiUnits);
不能使用Compute方法来计算包括多列的聚合——如SUM(Quantity*UnitPrice),但可使用基于表达式的列来执行两列的计算,接着在Count方法中使用基于该表达式的列——SUM(ItemTotal)。
Compute方法通过使用通常的Object数据类型来返回结果,因此当使用Compute方法执行计算时,用来存储结果的数据类型可能会令您吃惊。例如Quantity列的数据类型属性是16位的整数,但调用Compute方法返回的是64位整数。
如果不能确定调用Compute方法时存储结果的数据类型,可以使用下面的代码:
object objRetVal = tbl.Compute("SUM(Quantity)", 
                               "ProductID = 1");
Console.WriteLine(objRetVal.GetType().ToString());
Copy
EndInit
EndLoadData
GetChanges
GetErrors
ImportRow
LoadDataRow
NewRow
ImportRow接受DataRow对象,并将数据添加到DataTable中。
LoadDataRow方法会接受任一数组作为它的第一个参数。数组中的每个项对应DataTable的列集合的一项。LoadDataRow的第二个参数是控制新DataRow对象的RowState的Boolean值。如果希望是Added,应该置false,如果希望是Unmodified,设置为true即可。
NewRow方法会为DataTable返回一个新DataRow对象,此时新DataRow将不会存储在DataTable的Rows集合中,当已经将所需的列加入DataRow后,需要将这项添加到Rows集合中。
应该用哪种方法,建议如下:
如果不希望从不同DataTable中导入行,使用ImportRow方法。
如果希望根据文件内容一次添加若干行,使用LoadDataRow。
其他情况下,使用NewRow
RejectChanges
Reset
Select
可以使用select方法根据各种搜索条件来定位DataTable的一行或多行,Select方法会返回符合条件的一组DataRow对象。
6.6.6 DataTable对象的事件
ColumnChanged
ColumnChanging
RowChanged
RowChanging
RowDeleted
RowDeleting
 
6.6.7 DataColumn对象的属性
AllowDBNull
AutoIncrement
AutoIncrementSeed
AutoIncrementStep
Caption
如果在绑定的数据网格中显示DataTable的内容,可使用Caption属性来控制列的标题。在默认情况下,Caption属性将返回与ColumnName属性值相同的值。
ColumnMapping
当DataSet数据以xml返回时,可以使用ColumnMapping属性来控制ADO.NET如何写入列的内容。
ColumnMapping属性接受System.Data命名空间中的MappingType枚举的值。ColumnMapping属性默认值为Element,即表示DataRow中每一列的值都会显示在一个元素标签中。还可以将ColumnMapping属性设置为Attribute、Hidder或SimpleContent。
下面的例子表明了使用元素和使用DataSet中数据属性的区别。
Using Column.ColumnMapping = MappingType.Element
<MyDataSet>
  <Customers>
    <CustomerID>ABCDE</CustomerID>
    <CompanyName>New Customer</CompanyName>
    <ContactName>New Contact</ContactName>
    <Phone>425 555-1212</Phone>
  </Customers>
</MyDataSet>
Using Column.ColumnMapping = MappingType.Attribute
<MyDataSet>
  <Customers CustomerID="ABCDE" CompanyName="New Customer"
             ContactName="New Contact" Phone="425 555-1212" />
</MyDataSet>
 
ColumnName
DataType
默认设置为存储字符串。DataType属性接受Type属性的值。下面代码介绍了如何直接设置DataColumn对象的DataType属性和调用DataColumnCollection对象的Add方法。
DataColumn col = new DataColumn("NewColumn");
col.DataType = typeof(Decimal);
 
DataTable tbl = new DataTable("Products");
tbl.Columns.Add("ProductID", typeof(int));
tbl.Columns.Add("ProductName", typeof(string));
tbl.Columns.Add("UnitPrice", typeof(Decimal));
 
DefaultValue
Expression
可以将表达式存储在该属性中,并且每次请求列的内容时都会计算该表达式。只要不将该属性设置为默认空字符串,就会自动将DataColumn的ReadOnly属性设置为true。
下面代码介绍了如何设置DataColumn的Expression属性来返回DataTable中两列的乘积。
DataTable tbl = new DataTable("Order Details");
tbl.Columns.Add("OrderID", typeof(int));
tbl.Columns.Add("ProductID", typeof(int));
tbl.Columns.Add("Quantity", typeof(int));
tbl.Columns.Add("UnitPrice", typeof(Decimal));
DataColumn col = new DataColumn("ItemTotal", typeof(Decimal));
col.Expression = "Quantity * UnitPrice"
tbl.Columns.Add(col);
DataRow row = tbl.NewRow();
row["OrderID"] = 1;
row["ProductID"] = 1;
row["Quantity"] = 6;
row["UnitPrice"] = 18;
tbl.Rows.Add(row);
Console.WriteLine(row["ItemTotal"]);
ExtendedProperties
MaxLength
默认为-1。
Namespace
Ordinal
返回DataColumn在DataTable对象的列集合中的位置,该属性只读,并且如果DataColumn不在DataTable对象的Column集合中,返回-1。
Prefix
ReadOnly
如果设置了true,但只要是在将列内容添加到DataTable对象的rows集合前,仍然可以修改该列的内容。
Table
Unique
将该属性设置为true将隐式地为列所在的DataTable创建一个UniqueConstraint对象。类似地,给一列添加UniqueConstraint也会将该列的Unique属性设置为true。
如果创建一组列的唯一约束或主键,则每个DataColumn的属性都不会被设置为true,因为列中的值不一定是唯一的。
 
6.6.8 DataRow对象的属性
HasErrors
Item
ItemArray
RowError
RowState
Table
 
6.6.9 DataRow对象的方法
AcceptChanges
BeginEdit
CancelEdit
ClearErrors
Delete
实际上并不真正删除。如果希望彻底删除,可以先调用delete方法,然后调用AcceptChanges。
EndEdit
GetChildRows
获得当前DataRow的子行。要使用该方法,必须提供一个DataRelation或是该DataRelation的名称。还可以提供DataRowVersion枚举中的值来控制获取数据的版本。
该方法返回一组DataRow对象中的子数据。
GetColumnError
SetColumnError
GetColumnsInError
 
GetParentRow
GetParentRows
SetParentRow
GetParentRow和SetParentRow提供了一种简便的方法来分别查看和设置DataRelation对象中当前行的父行。
同GetChildRows方法一样,GetParentRow接受DataRelation名称或对象本身。也接受DataRowVersion枚举中的值来控制获取数据的版本。GetParentRow方法返回一个DataRow对象。
如果当前DataRow有多个父行,可以使用GetParentRows方法访问那些行。
调用SetParentRow可以修改关系中的父行,使用该方法只需要传递该行的新的父行。如果当前行的DataTable是DataSet中多个关系的字表,则必须使用允许将DataRelation对象作为第二个参数传递的重载方法,这样SetParentRow方法才能知道希望引用的是哪个关系。
HasVersion
是否具有某一版本的值。(该版本是DataRowVersion枚举中的值)
IsNull
假设您正在处理包含客户信息的DataRow,并希望将获取的ContactName列内容赋给一个字符串变量,如果使用下面的代码,且ContactName列包含Null值,则有可能出现问题。( 注意:强类型 DataSet 中确实存在的
DataRow row;
。。。。
string strContactName;
strContactName = (string) row["ContactName"];
要避免上面的问题,可以有2种方法:创建的数据库和数据集的列不支持null值,或在列的内容之前查看列中是否有null值。
IsNull正是为第二种方法准备的。
RejectChanges
 
6.6.10 UniqueConstraint对象的属性
Columns
ConstraintName
ExtendedProperties
IsPrimaryKey
Table
6.6.11 ForeignkeyConstraint对象的属性
AcceptRejectRule
DeleteRule
UpdateRule
这3个属性控制父行的修改怎样影响子行。
AcceptRejectRule接受AcceptRejectRule枚举中的值。该属性默认值为None,即表示如果对行调用AcceptChanges方法或RejectChanges方法,子行不会受到影响。如果设置为Cascade,该操作会根据ForeignkeyConstraint对象中定义的规则级连其子行。
DeleteRule和UpdateRule属性很相似,都接受Rule枚举中的值,两个属性的默认值都是Cascade,表示父行的更改会自动级连到字行。
如果不希望级连,也可以将DeleteRule和UpdateRule属性值设置为None。还可以将它们设置为SetDefault或SetNull。设置SetNull的话,父行被删除或其相关联的列的内容被改变时,子行中相关联的列的内容则为null。SetDefault和SetNull差不多,只不过子行中相关联的列的内容被设置为其默认值。
Columns
ConstraintName
ExtendedProperties
RelatedColumns
RelatedTable
Table
6:44 PM | 评论 (0)
回顾Chap.6 处理DataSet对象(2)
6.5 修改DataTable内容
6.5.1 添加新DataRow
DataTable对象有一个返回新DataRow对象的方法,该对象包含了表中每一列的信息。
DataRow row=ds.Tables[“Customers”].NewRow();
row[“CustomerID”]=”ALFKI”;
创建新的DataRow后,就可以使用它的item属性来填充不同的列,还可以使用item属性检查行中列的内容。
DataTable的NewRow方法创建一个新行,但并不会将该行添加到DataTable中。通常由于刚创建的行是空行,所以在新行刚创建时您并不希望添加新行。如果列没有默认值,该列就被设置为Null。
一旦给新行所有需要的列赋值后,就可以使用DataRowCollection的Add方法来将新行添加到DataTable中。如下:
ds.Tables[“Customers”].Rows.Add(row);
 
DataTable对象还提供了另一种方法来将新行添加到表中:LoadDataRow方法。使用该方法,需要给第一个参数提供一组数值,数组中的数值项与表中的列相对应;AcceptChanges是LoadDataRow方法的第二个参数,它允许控制新行DataRow的RowState属性值。下面代码中该值为false,则新行的RowState属性值为Added。
Object[] aValues={“ALFKI”,”alfreds Futterkiste”,”Maria Anders”,”030-0074321”};
ds.Tables["Customers"].LoadDataRow(aValues, false);
如果第二个参数的值为true,则新DaraRow的RowState值将为Unmodified,即表示该行不包含DataAdapter要提交给数据库的挂起更改。
6.5.2 修改当前行
有3种方法可以修改当前行。
1) 使用DataRow对象的item属性对列赋值。
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ANTON");
if (rowCustomer == null)
    //Customer not found!
else {
    rowCustomer["CompanyName"] = "NewCompanyName";
    rowCustomer["ContactName"] = "NewContactName";
}
2) 与第一种类似,只是添加了 BeginEdit EndEdit 方法
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ANTON");
if (rowCustomer == null)
    //Customer not found!
else {
    rowCustomer.BeginEdit();
    rowCustomer["CompanyName"] = "NewCompanyName";
    rowCustomer["ContactName"] = "NewContactName";
    rowCustomer.EndEdit();
}
使用 BeginEdit EndEdit 方法可以缓存对行的更改。此外,这种方式,在EndEdit前会阻止更新事件(如RowChanging, RowChanged, ColumnChanging, ColumnChanged)的发生。
3) 使用ItemArray属性。
同Item属性一样,使用ItemArray属性可以检索或修改行的内容,不同之处就在于Item属性一次只能处理一行,而ItemArray属性可以返回并接受对应列的一组项目。
object[] aCustomer={"ALFKI","NewCompanyName", "NewContactName", "NewPhoneNo"};
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.ItemArray = aCustomer;
如果希望使用ItemArray属性,但是又不希望修改行中每一列的值,可以使用null关键字。
object[] aCustomer = {null, "NewCompanyName", 
                      "NewContactName", "NewPhoneNo"};
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.ItemArray = aCustomer;
 
6.5.3 处理DataRow的空值
DataRow对象有IsNull方法,可以查看列是否包含空值。同数据行对象的Item方法一样,IsNull方法接受列的名字、列在表中的索引或 DataColumn对象。
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
if (rowCustomer.IsNull("Phone"))
    Console.WriteLine("It's Null");
else 
Console.WriteLine("It's not Null");
 
希望给列赋空值时,不必使用所选编程语言中的关键字Null,可以使用DBNull类的value属性。
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer["Phone"] = DBNull.Value;
 
6.5.4 删除DataRow
简单地调用DataRow的Delete方法就可以了。删除行并不是把它从DataTable中删掉,而是将行标志为挂起删除,以反映到数据库中。
6.5.6 清除DataRow
如果一定要从DataTable中清除行而不是将它标志为挂起删除,可以使用DataRowCollection类的Remove或RemoveAt方法。如果有对要删除的DataRow的引用,可以用前者;如果有索引编号,用后者。
此外,DataSet类和DataTable类分别包含了Clear方法,可以使用该方法从DataSet或DataTable中清除所有的DataRow对象而保留其结构。
6.5.7 使用DataRow.RowState属性
ADO.NET必须知道对DataRow所做修改的类型,这样以后才能成功地将更改提交给数据库。ADO.NET将此信息存储在DataRow中名为RowState的属性中,该属性用DataRowState枚举值通过查看属性可以知道行是否改动和修改类型(插入、删除或修改)。
DataRowState枚举值包括:
Unchanged      2     不包含任何挂起更改
Detached         1     该行不是DataTable的成员
Added             4     该行已被添加到DataTable中,却不在数据库中
Modified          16    该行包含挂起更改
Deleted            8     该行是一个挂起删除
 
6.5.8 检查DataRow中的挂起更改
依靠RowState属性可以浏览DataTable的内容并找到修改的行。
可以使用DataTable的Item属性来查看行中列的内容,Item属性可以接受DataRowVersion枚举中的第二个可选参数,DataRowVersion枚举包括:
Current    512         存储在列中的当前值
Original    256         存储在列中的原始值
Proposed 1024       列的建议值,只有当使用BeginEdit编辑行时有效
Default     1536       默认操作
 
注意:
Original值是从数据库中取得的值,不会改变。
删除行后无法访问Current,但可以访问Original
枚举中Default表示DataRow对象的Item属性中参数的默认值
 
如果不是正处于编辑行的过程中,那么调用Item并省略可选参数等价于将DataRowVersion.Current常数作为可选参数。如果是在编辑行的过程中,将得到列的Proposed值。
6:43 PM | 评论 (0)
回顾Chap.6 处理DataSet对象(1)
6. 处理DataSet对象
6.1 DataSet的特性
DataSet对象其核心为数据的集合
特性:
1)        处理脱机数据
2)        浏览、排序、搜索和过滤
3)        处理分级数据
4)        缓存更改
5)        Xml集成
6)        统一的功能
6.2 使用DataSet对象
1)        DataColumn对象
属性:Name,Ordinal,DataType
2)        DataRow对象
可以提供 列的名称列在 DataTable 中的序数位置DataColumn 对象三种方式访问DataRow对象中特定列的值,效率依次提高。
3)        Constraint对象
 
6.3 校验DataSet中的数据
6.3.1 校验DataColumn的属性
设置DataColumn对应属性:
ü         ReadOnly
ü         AllowDBNull
ü         MaxLength
ü         Unique
6.3.2 DataTable对象的Constraints集合
ADO.NET中有两个类(UniqueConstraint和ForeignkeyConstraint)可以用于DataTable中定义约束。
DataTable提供一个Constraints属性可以用于添加、修改或查看DataTable上的约束。
ü         UniqueConstraints
    如果设置了DataColumn的Unique属性为true,也就在包含该列的DataTable里定义了一个约束,同时还将UniqueConstraints添加到DataTable对象的Constraints属性中。
    设置unique属性的方式比创建一个UniqueConstraint容易,但在确定多列合并后的值是否唯一的时候,需要创建UniqueConstraint。
ü         Primarykey
    是UniqueConstraint的一种特殊类型,ADO.NET的DataRowCollection对象用Find方法来根据主键列的值查找DataTable的行。
    可以使用DataTable对象的PrimaryKey属性设置和查看主键。
ü         ForeignkeyConstraint
    将外部约束添加到DataTable中。通常不必刻意去创建ForeignkeyConstraint,因为当在DataSet的两个DataTable对象之间创建一个DataRelation的过程时,也会创建一个ForeignkeyConstraint。
注意:在DataSet的列和表中定义的约束只能在该DataSet中有效。
6.3.3 用DataAdapter.Fill模式来检索模式信息
验证数据是需要时间的。许多方案都没有对DataSet设置验证属性,所以除非有明确的要求,DataAdapter对象的Fill方法在创建DataTable时并不对DataColumn对象设置验证属性,也不会将约束添加到DataTable对象的约束集合中。
当将列添加到DataTable时,可以用两种方法来通知DataAdapter在数据库中检索该模式信息:一种是通过将DataAdapter对象的MissingSchemaAction属性设置为AddWithKey来实现的,另一种是调用DataAdapter对象的FillSchema方法。
DataAdapter将试图为DataTable生成一个主键,这是相当糟糕的。如果表含有一个包括两个列的主键而使用的查询却不包括这些列,DataAdapter将不再使用DataTable中的这个主键。
DataAdapter也将设置新DataColumn对象的AutoIncrement属性。
6.4 编写代码创建DataTable对象
1)        创建DataTable 对象
DataTable tbl=new DataTable(“TableName”);
2)        将DataTable 添加到DataSet 对象的Tables 集合
DataTable tbl=new DataTable(“TableName”);
ds.Tables.Add(tbl);

ds.Tables.Add(“Customers”);
可以通过查看DataTable对象的DataSet属性来确定一个DataTable是否存在于DataSet中。
DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用copy或clone方法。前者创建一个与原DataTable结构相同,并且包含相同行的新DataTable;后者创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。
3)        为DataTable 添加列
DataColumn col=tbl.Columns.Add(”CustomerID”);
4)        指定DataColumn 的数据类型
可以使用DataColumn的DataType属性来设置或查看列将包含的数据类型。直到将数据添加到DataTable对象的Rows集合后,DataColumn对象的DataType属性才不是可读写的。
数据库的数据类型同DataColumn的数据类型不是一一映射的。
DataColumn的DataType属性默认为字符串,此外,DataColumn还包含一个构造函数,可以指定数据类型和所创建的新列的名称。同样,重载DataColumn集合对象的Add方法可以允许为新建DataTable对象和新建DataColumn对象的ColumnName和DataType属性赋值。
DataColumn col=tbl.Columns.Add(“OrderID”,typeof(int));
5)        添加主键
PrimaryKey属性包含一个DataColumn对象数组,所以不能只简单地将列的名称设置为主键。
tbl.PrimaryKey=new DataColumn[] {tbl.Columns[“OrderID”], tbl.Columns[“ProductID”]};
注意:为DataTable设置主键时,ADO.NET会自动将DataColumn对象或主键中引用到的对象的AllowDBNull属性设置为false。
6)        添加其他约束
DataTable的约束集合有一个重载的Add方法,可以添加新的主键、唯一键和外键约束。
用代码创建约束有两种方法:
第一种是直接创建一个新的约束对象并将它添加到DataTable的约束集合中。
tbl.Constraints.Add(New UniqueConstraint(…));
第二钟方法是使用约束集合对象的Add方法创建新约束并将它添加到集合中。
tbl.Constraints.Add(“ConstraintName”,ColumnInformation);
推荐使用第一种方法,因为容易理解。
tbl.Constraints.Add(new UniqueConstraint(tbl.Columns["CustomerID"]));
//or
tbl.Constraints.Add("UK_Customers", tbl.Columns["CustomerID"],
                    false);
      
//Add a unique key based on the OrderID and ProductID columns.
DataColumn[] cols = new DataColumn[] {tbl.Columns["OrderID"],
                                      tbl.Columns["ProductID"]};
tbl.Constraints.Add(new UniqueConstraint(cols));
//or
tbl.Constraints.Add("UK_Order Details", cols, false);
      
//Add a foreign key constraint based on the OrderID column that
//requires a corresponding OrderID in the Orders table.
tbl.Constraints.Add(new ForeignKeyConstraint
                    (ds.Tables["Orders"].Columns["OrderID"],
                     tbl.Columns["OrderID"]));
//or
tbl.Constraints.Add("FK_Order Details_Orders",
                    ds.Tables["Orders"].Columns["OrderID"],
                    tbl.Columns["OrderID"]);
7)        处理自动增量列
ADO.NET通过DataColumn的3个属性来支持自动增量列,它们是:AutoIncrement、AutoIncrementSeed和AutoIncrementStep。
将DataColumn的AutoIncrement属性设置为true就可以为DataTable的新行生成自动增量值。
DataSet ds = new DataSet();
DataTable tbl = ds.Tables.Add("Orders");
DataColumn col = tbl.Columns.Add("OrderID", typeof(int));
col.AutoIncrement = true;
col.AutoIncrementSeed = -1;
col.AutoIncrementStep = -1;
col.ReadOnly = true;
依靠ADO.NET的自动增量功能,可在将行添加到DataTable时让ADO.NET对行进行计算,从而分页显示DataTable,而不用根据查询规则和行的排序来实现。
AutoIncrement 的可为与不可为:
*可为:使用自动增量特性
*不可为:将生成的自动增量值提交给DB。该值仅仅是占位符。
*不可为:显示还未提交给数据库的新行自动增量值
*可为:将AutoIncrementSeed和AutoIncrementStep设置为-1,这样能确保生成的占位符不会在数据库中出现。即使在应用程序中显示该值,用户也不会误认为ADO.NET生成的自动增量值和数据库生成的自动增量值相同。
8)        添加基于表达式的列
ADO.NET允许创建基于表达式的DataColumn对象。可以将DataColumn对象的Expression属性设置为一个表达式,而用不着在查询中包含表达式。当查看列的内容时,ADO.NET就会计算表达式并返回结果。
tbl.Columns.Add("Quantity", typeof(int));
tbl.Columns.Add("UnitPrice", typeof(Decimal));
tbl.Columns.Add("ItemTotal", typeof(Decimal),"Quantity * UnitPrice");
 

你可能感兴趣的:(DataSet对象)