日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ADO与ADO.NET

發布時間:2025/4/16 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADO与ADO.NET 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天老板又提到了客戶端游標與服務端游標,并給我們講了性能差別。但是....我用了好久的.NET,都忘了很久很久以前曾經的ADO,原來老板是在講ADO的游標類型。嗚~回來翻了下網,找了以下的內容重新學習一下:

您可以使用無數種方法在 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 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 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) a€| '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

在實例化 DataTable 對象之后,您就可以使用這個事件模型將事件處理程序“DataColumnChangeEventHandler”設置為自定義例程。通過傳遞 ColumnChanged 例程的地址,只要一個列中的數據更改,您就可以執行這個處理程序。在本例中,我們要使用它來確定職員被雇傭以來的天數(請參見清單 5)。

清單 5. ColumnChanged 事件處理程序。

Sub ColumnChanged(ByVal sender As Object, _ByVal e As DataColumnChangeEventArgs)If e.Column.ColumnName = "HireDate" Thene.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 ThenExit Sub End If 'Loop thru changed rows, make db updates For Each oDataRow In oChangeDT.RowsSelect Case oDataRow.RowStateCase DataRowState.Added'Insert code hereCase DataRowState.Modified'Update code hereCase DataRowState.Deleted'Delete code hereEnd 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 的數據訪問技術正趨向于廣泛使用離線數據,因此了解如何使用離線數據對您未來的開發工作是至關重要的。

下載 408CARL1.ZIP

有關 Hardcore Visual Basic 和 Pinnacle Publishing 的詳細信息,請訪問其網站 http://www.pinpub.com/

注:這不是 Microsoft Corporation 的網站。Microsoft 對該網站的內容不承擔責任。

本文是從 Hardcore Visual Basic 2004 年 8 月號轉載的。版權所有 2004,Pinnacle Publishing, Inc.(除非另行說明)。保留所有權利。Hardcore Visual Basic 是 Pinnacle Publishing, Inc. 獨立發行的產品。未經 Pinnacle Publishing, Inc. 事先同意,不得以任何形式使用或復制本文的任何部分(評論文章中的簡短引用除外)。要聯系 Pinnac

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的ADO与ADO.NET的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。