技术开发 频道

在ADO和ADO.NET中管理离线数据

    在实例化 DataTable 对象之后,您就可以使用这个事件模型将事件处理程序“DataColumnChangeEventHandler”设置为自定义例程。通过传递 ColumnChanged 例程的地址,只要一个列中的数据更改,您就可以执行这个处理程序。在本例中,我们要使用它来确定职员被雇佣以来的天数(请参见清单 5)。

    清单 5. ColumnChanged 事件处理程序。
Sub ColumnChanged(ByVal sender As Object, _ ByVal e As DataColumnChangeEventArgs) If e.Column.ColumnName = "HireDate" Then e.Row("DaysSinceHire") = _ DateDiff(DateInterval.Day, _ e.Row("HireDate"), Date.Today) End If End Sub

     由于用户在网格中编辑数据、添加和删除行,因此每个行对象的 RowState 属性会更改,以指示所作修改的类型。当用户将离线数据提交到 RDBMS 时,需要计算每一行来确定用户执行了何种类型的更改。要完成这一操作,您可以通过 GetChanges 方法检索包含所有新近添加、修改和删除的行的 DataTable 对象。然后,循环访问这个新 DataTable 中的每个行对象并计算 RowState 属性,如清单 6 中所示。

    清单 6. 标识更改的行并保存更改。

Dim oDataRow As DataRow Dim oChangeDT As DataTable 'Get DataTable with only changed rows oChangeDT = oEmployeeDT.GetChanges() 'Save button s/b disabled until a change is made If oChangeDT Is Nothing Then Exit Sub End If 'Loop thru changed rows, make db updates For Each oDataRow In oChangeDT.Rows Select Case oDataRow.RowState Case DataRowState.Added 'Insert code here Case DataRowState.Modified 'Update code here Case DataRowState.Deleted 'Delete code here End Select Next oChangeDT.Dispose() oChangeDT = Nothing oDataRow = Nothing 'Issue AcceptChanges method to reset RowState values oEmployeeDT.AcceptChanges()

    假定我们需要(比如说)以一对多 (1:M) 的关系使用多个表。因为数据是相关的,所以我们可以在一个单独的 DataTable 中管理该信息,并在 DataSet 对象的保护下维护两个 DataTable 之间的关系。在以下示例中,我们将为每个职员指定多种薪水,并在相关的网格控件中查看它们。通过使用 DataRelation 对象,我们可以在两个数据集之间创建一个内存中关系,并将 Employee 表的 ID 列用作主键 (PK),而将 Paycheck 表的 EmployeeID 列用作外键 (FK)。引用完整性 (RI) 原则告诉我们,当一个职员记录被删除时,所有关联的薪水数据也必须被删除。为了实施这个规则,我们可以设置一个 ForeignKeyConstraint 对象(请参见清单 7)。

    清单 7. 设置数据关系。

Dim oDataRelation As DataRelation Dim oParentColumn As DataColumn Dim oChildColumn As DataColumn Dim oForeignKeyConstraint As ForeignKeyConstraint GetPaychecks() 'Manage both tables from within a DataSet object oDS.Tables.Add (oEmployeeDT) oDS.Tables.Add (oPayCheckDT) 'Retrieve PK, FK from the employee, paycheck tables oParentColumn = oEmployeeDT.Columns("ID") oChildColumn = oPayCheckDT.Columns("EmployeeID") 'Create DataRelation object to maintain relationship oDataRelation = New DataRelation("EmployeePaycheck", _ oParentColumn, oChildColumn) oDS.Relations.Add (oDataRelation) 'Create ForeignKeyConstraint obj. to enforce delete oForeignKeyConstraint = New _ ForeignKeyConstraint(oParentColumn, oChildColumn) oForeignKeyConstraint.DeleteRule = Rule.Cascade

    实际上,本文只是粗浅地探讨了您在 VB6 和 .NET 中使用离线数据可以实现的操作。由于 Microsoft 的数据访问技术正趋向于广泛使用离线数据,因此了解如何使用离线数据对您未来的开发工作是至关重要的。

0
相关文章