技术开发 频道

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

【IT168技术文档】

    您可以使用无数种方法在 VB6 和 VB.NET 中处理数据。这两个平台都支持诸如数组和集合之类的结构,开发人员通常将自定义类包装到这些结构中,就如您在 Carl Ganz 2004 年 3 月的专栏中看到的那样。数据独立(这可能是创建自定义数据抽象层的最大优势)允许用户在独立于数据库的情况下操作数据。这不仅降低了服务器的负担,还消除了维护到该数据库的开放连接的需要,或是对忘记更新 RDBMS 的担心。本月,Carl 将分析如何同时使用 ADO 和 ADO.NET 来创建此类数据对象。

    在 VB6 中,OLE DB 游标服务允许您创建通常作为虚构的Recordset 的内容。这些只是 ADO Recordset 对象的内存中实例,Field 对象将添加到这些实例中以形成一个数据结构。您需要显式创建这些 Recordset 客户端,如清单 1 中所示;默认情况下,它们是在服务器端创建的,您在服务器上不能有离线 Recordset。

Set oRS = New ADODB.Recordset oRS.CursorLocation = adUseClient oRS.CursorType = adStatic oRS.LockType = adLockBatchOptimistic 'Add a few fields With oRS.Fields .Append "LastName", adVarChar, 40, adFldIsNullable .Append "FirstName", adVarChar, 40, adFldIsNullable .Append "HireDate", adDate End With oRS.Open

    一旦创建 Recordset,您就可以用数据填充它了。请注意,Field 集合的 Append 方法只能用于关闭的 Recordset;如果您在打开 Recordset 的 Fields 集合上或是已设置 ActiveConnection 属性的 Recordset 上调用 Append,就会导致运行时错误。清单 2 阐释了如何将数据添加到 Recordset 对象。

    清单 2 中的最后两行代码阐释了如何创建索引,以使排序更加高效。(通常,您应通过一个提供初始排序的 SQL 命令来加载此类数据,但是如果数据在网格中,您可能希望允许用户通过(比如说)单击列标题来排序它。)

    清单 2. 用数据填充 Recordset 对象。

'Populate with some data oRS.AddNew Array("LastName", "FirstName", "HireDate")_ , Array("Washington", "George", "3/12/2003") oRS.AddNew Array("LastName", "FirstName", "HireDate")_ , Array("Adams", "John", "8/5/2003") oRS.AddNew Array("LastName", "FirstName", "HireDate")_ , Array("Jefferson", "Thomas", "4/27/2003") oRS.Update 'Create an in-memory index oRS.Fields("LastName").Properties("Optimize").Value _ = True 'Sort on first name oRS.Sort = "FirstName"

    创建 Recordset 的另一种方法涉及到离线 Recordset。这只是一个 Recordset 对象,它随后将连接到由于将 ActiveConnection 属性设置为 Nothing 而离线的服务器(请参见清单 3)。

    清单 3. 创建离线 Recordset。

Dim objConnection As ADODB.Connection Dim szSQL As String Set objConnection = New ADODB.Connection 'Open a connection objConnection.ConnectionString = "whatever" objConnection.Open 'Instantiate a Recordset object... Set oRS = New ADODB.Recordset oRS.CursorLocation = adUseClient oRS.CursorType = adOpenStatic oRS.LockType = adLockBatchOptimistic '...and set the ActiveConnection property Set oRS.ActiveConnection = objConnection szSQL = "SELECT LastName, FirstName " & _ "FROM Employees " & "ORDER BY LastName, FirstName" 'Open the Recordset and return the employee data oRS.Open szSQL Set oRS.ActiveConnection = Nothing objConnection.Close Set DataGrid1.DataSource = oRS

    使用 ADO.NET
    ADO.NET 为离线数据管理提供了更强大的功能。DataTable 和 DataSet 对象本身就定义为离线,因此您不必执行任何操作来使它们离线。从概念上来说,ADO.NET DataTable 对象和 ADO Recordset 对象的编程创建过程非常类似,如清单 4 中所示。在本示例中,我们要创建一个 DataTable 对象,并向其添加列和行对象。正如您将看到的那样,ADO.NET 的方法使用了一个比基于 COM 的 ADO 所使用的更加层次化的对象模型。

    清单 4. 创建 ADO.NET DataTable 对象。

Dim oDataRow As DataRow Dim oDataColumn As DataColumn Dim aPrimaryKey(0) As DataColumn oDS = New DataSet 'Create a new DataTable oect oEmployeeDT = New DataTable 'Add an event handler for column data changes AddHandler oEmployeeDT.ColumnChanged, _ New DataColumnChangeEventHandler(AddressOf _ ColumnChanged) 'Create primary key (PK) col and add it to the columns 'collection. Set init value to 1, increment as needed. oDataColumn = New DataColumn oDataColumn.ColumnName = "ID" oDataColumn.DataType = _ System.Type.GetType("System.Int32") oDataColumn.AutoIncrement = True oDataColumn.AutoIncrementSeed = 1 oEmployeeDT.Columns.Add (oDataColumn) 'PK property receives array of DataColumn objects in 'case you have multi-col index. I prefer an ID column. aPrimaryKey(0) = oDataColumn oEmployeeDT.PrimaryKey = aPrimaryKey 'Create the individual data columns 鈥? oDataColumn = New DataColumn oDataColumn.ColumnName = "Salary" oDataColumn.DataType = _ System.Type.GetType("System.Decimal") oEmployeeDT.Columns.Add (oDataColumn) 'Here we use DataColumn's Expression property to show 'what a 28% tax on the salary will amount to. oDataColumn = New DataColumn oDataColumn.ColumnName = "IncomeTax" oDataColumn.DataType = _ System.Type.GetType("System.Decimal") oDataColumn.Expression = "Salary * .28" oEmployeeDT.Columns.Add (oDataColumn) oDataColumn = New DataColumn oDataColumn.ColumnName = "HireDate" oDataColumn.DataType = _ System.Type.GetType("System.DateTime") oEmployeeDT.Columns.Add (oDataColumn) 'This col receives the value calc'd by event handler oDataColumn = New DataColumn oDataColumn.ColumnName = "DaysSinceHire" oDataColumn.DataType = _ System.Type.GetType("System.Int16") oEmployeeDT.Columns.Add (oDataColumn) 'Once the columns are added, add sample data oDataRow = oEmployeeDT.NewRow() oDataRow("LastName") = "Washington" oDataRow("FirstName") = "George" oDataRow("Salary") = 45000 oDataRow("IncomeTax") = True oDataRow("HireDate") = "4/12/1981" oEmployeeDT.Rows.Add (oDataRow) 鈥? 'Commit new data to the DataTable object and set 'RowState values of each row to Unchanged oEmployeeDT.AcceptChanges() 'Let's show the user DataGrid1.DataSource = oEmployeeDT
   
0
相关文章