您可以使用無數種方法在 VB
和 VB
NET 中處理數據
這兩個平台都支持諸如數組和集合之類的結構
開發人員通常將自定義類包裝到這些結構中
就如您在 Carl Ganz
年
月的專欄中看到的那樣
數據獨立(這可能是創建自定義數據抽象層的最大優勢)允許用戶在獨立於數據庫的情況下操作數據
這不僅降低了服務器的負擔
還消除了維護到該數據庫的開放連接的需要
或是對忘記更新 RDBMS 的擔心
本月
Carl 將分析如何同時使用 ADO 和 ADO
NET 來創建此類數據對象
在 VB
中
OLE DB 游標服務允許您創建通常作為虛構的Recordset 的內容
這些只是 ADO Recordset 對象的內存中實例
Field 對象將添加到這些實例中以形成一個數據結構
您需要顯式創建這些 Recordset 客戶端
如清單
中所示
默認情況下
它們是在服務器端創建的
您在服務器上不能有離線 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
adFldIsNullable
Append
FirstName
adVarChar
adFldIsNullable
Append
HireDate
adDate
End With
oRS
Open
一旦創建 Recordset
您就可以用數據填充它了
請注意
Field 集合的 Append 方法只能用於關閉的 Recordset
如果您在打開 Recordset 的 Fields 集合上或是已設置 ActiveConnection 屬性的 Recordset 上調用 Append
就會導致運行時錯誤
清單
闡釋了如何將數據添加到 Recordset 對象
清單
中的最後兩行代碼闡釋了如何創建索引
以使排序更加高效
(通常
您應通過一個提供初始排序的 SQL 命令來加載此類數據
但是如果數據在網格中
您可能希望允許用戶通過(比如說)單擊列標題來排序它
)
清單
用數據填充 Recordset 對象
Populate with some data
oRS
AddNew Array(
LastName
FirstName
HireDate
)_
Array(
Washington
George
/
/
)
oRS
AddNew Array(
LastName
FirstName
HireDate
)_
Array(
Adams
John
/
/
)
oRS
AddNew Array(
LastName
FirstName
HireDate
)_
Array(
Jefferson
Thomas
/
/
)
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 而離線的服務器(請參見清單
)
清單
創建離線 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 DataGrid
DataSource = oRS
使用 ADONET ADO
NET 為離線數據管理提供了更強大的功能
DataTable 和 DataSet 對象本身就定義為離線
因此您不必執行任何操作來使它們離線
從概念上來說
ADO
NET DataTable 對象和 ADO Recordset 對象的編程創建過程非常類似
如清單
中所示
在本示例中
我們要創建一個 DataTable 對象
並向其添加列和行對象
正如您將看到的那樣
ADO
NET 的方法使用了一個比基於 COM 的 ADO 所使用的更加層次化的對象模型
清單
創建 ADO
NET DataTable 對象
Dim oDataRow As DataRow
Dim oDataColumn As DataColumn
Dim aPrimaryKey(
) 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
increment as needed
oDataColumn = New DataColumn
oDataColumn
ColumnName =
ID
oDataColumn
DataType = _
System
Type
GetType(
System
Int
)
oDataColumn
AutoIncrement = True
oDataColumn
AutoIncrementSeed =
oEmployeeDT
Columns
Add (oDataColumn)
PK property receives array of DataColumn objects in
case you have multi
col index
I prefer an ID column
aPrimaryKey(
) = oDataColumn
oEmployeeDT
PrimaryKey = aPrimaryKey
Create the individual data columns
a€|
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
% tax on the salary will amount to
oDataColumn = New DataColumn
oDataColumn
ColumnName =
IncomeTax
oDataColumn
DataType = _
System
Type
GetType(
System
Decimal
)
oDataColumn
Expression =
Salary *
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
Int
)
oEmployeeDT
Columns
Add (oDataColumn)
Once the columns are added
add sample data
oDataRow = oEmployeeDT
NewRow()
oDataRow(
LastName
) =
Washington
oDataRow(
FirstName
) =
George
oDataRow(
Salary
) =
oDataRow(
IncomeTax
) = True
oDataRow(
HireDate
) =
/
/
oEmployeeDT
Rows
Add (oDataRow)
a€|
Commit new data to the DataTable object and set
RowState values of each row to Unchanged
oEmployeeDT
AcceptChanges()
Let
s show the user
DataGrid
DataSource = oEmployeeDT
在實例化 DataTable 對象之後
您就可以使用這個事件模型將事件處理程序
DataColumnChangeEventHandler
設置為自定義例程
通過傳遞 ColumnChanged 例程的地址
只要一個列中的數據更改
您就可以執行這個處理程序
在本例中
我們要使用它來確定職員被雇傭以來的天數(請參見清單
)
清單
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 屬性
如清單
中所示
清單
標識更改的行並保存更改
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
From:http://tw.wingwit.com/Article/program/net/201311/12866.html