使用ADO.NET解鎖MicrosoftAccess數據

發表于:2007-05-25來源:作者:點擊數: 標簽:解鎖ADO.NET使用
使用 ADO.NET 解鎖 Microsoft Access 數據 Paul Cornell Microsoft Corporation 2001 年 12 月 6 日 Microsoft Office 提供了多種存儲和管理數據的功能和工具,例如,數據訪問對象 (DAO)、ActiveX 數據對象 (ADO)、Microsoft Word 郵件合并、Microsoft Excel
使用 ADO.NET 解鎖 Microsoft Aclearcase/" target="_blank" >ccess 數據
Paul Cornell
Microsoft Corporation
2001 年 12 月 6 日

Microsoft® Office 提供了多種存儲和管理數據的功能和工具,例如,數據訪問對象 (DAO)、ActiveX® 數據對象 (ADO)、Microsoft Word 郵件合并、Microsoft Excel Web 查詢、Microsoft Query、數據訪問頁、Microsoft Access 數據項目、Office 數據連接、Office 數據鏈接等等。而 Microsoft .NET 平臺則提供了其他的數據訪問功能和工具,例如,ADO.NET、.NET 數據連接和數據庫項目。

在本月的專欄中,我將介紹如何使用 Microsoft Visual Studio® .NET、Microsoft Visual Basic® .NET,特別是如何使用 ADO.NET 來解鎖和管理 Microsoft Access 數據。

確定何時最適合使用 ADO.NET

既然 Office 已經提供了一系列數據訪問功能和工具,為什么不利用 Office 來管理它自己的數據呢?當然,在許多情況下,您可能希望使用適合某個特定數據任務的內置 Office 功能和工具。然而,ADO.NET 提供了一種添加數據連接和編寫數據解決方案代碼的統一方法,這種方法不同于 Office 中的多個數據入口點和數據訪問庫。

如果您愿意,仍然可以在 Visual Studio .NET 和 Visual Basic .NET 中調用 ADO 功能。但鑒于以下原因,與 ADO 相比,ADO.NET 在許多方面都是更好的數據訪問解決方案。

  • ADO.NET 允許在數據集中包含多個表,包括這些表之間的關系。ADO 只允許包含一個結果表(雖然此單個結果表可能是多個相關表上所執行的 JOIN 操作的結果)。
  • ADO.NET 提供斷開連接的數據訪問。ADO 也可以提供斷開連接的數據訪問,但 ADO 主要是為連接的數據訪問而設計的。
  • ADO.NET 提供了一個記錄導航范例,允許進行無序的數據訪問(與有序的 ADO Move 方法不同),并可以利用數據表之間的關系訪問各個數據表。
  • 因為 ADO.NET 使用 XML 傳送數據,所以能夠提供比 ADO 更豐富的數據類型,獲得更好的數據訪問性能,還可以使數據穿過防火墻傳遞。
  • ADO.NET 經過了高度優化,以配合 Microsoft SQL Server 7.0 和 Microsoft SQL Server 2000 數據庫的使用(反映在 ADO.NET Sql 對象中),同時提供對其他 OLE DB 數據源(如 Microsoft Access 數據庫)的編程訪問(反映在 ADO.NET OleDb 對象中)。

當然,如果希望利用 .NET 中的諸多新功能,就應該使用 .NET 數據訪問功能和工具。有關 .NET 平臺的詳細信息,請參閱以前的專欄 Introducing .NET to Office Developers(英文)。

ADO.NET 入門

圖 1 顯示了使用 ADO.NET 時要用到的主要對象。

圖 1:ADO.NET 對象模型中的主要對象(來源:Inside .NET Managed Providers [英文])

這些對象包括:

  • OleDbConnection SqlConnection 對象,代表數據庫連接,類似于 ADO 的 Connection 對象。
  • OleDbCommandSqlDbCommand 對象,代表將要直接發送到數據庫的 SQL 文本字符串,類似于 ADO 的 Command 對象。
  • OleDbDataAdapterSqlDataAdapter 對象,用于保存數據庫的 SELECT、INSERT、UPDATE 和 DELETE 命令。這些對象可以作為數據庫和 DataSet 對象之間的中介??梢允褂?Fill 方法填充 DataSet 對象并從數據庫斷開連接,然后使用 Update 方法重新連接到數據庫,并將在 DataSet 對象中所做的更改保存回數據庫。
  • DataSet 對象包含實際數據的副本,類似于斷開連接的 ADO Recordset 對象。DataSet 對象可以包含 DataRelation 對象和 Contraint 對象,這兩個對象分別代表數據表之間的關系和這些表中數據的約束。DataSet 對象還可以包含 DataTable 對象,該對象又可以包含 DataColumnDataRow 對象。使用 DataTableMapping 對象和 DataColumnMapping 對象,數據集可以將數據庫中的表和列映射為相應的 DataTable 對象和 DataColumn 對象。
  • SqlDataReader 對象和 OleDbReader 對象代表連接的、僅向前移動的、只讀數據讀取器。如果能夠保持與數據庫的持續連接,并且只希望讀取數據而不進行更改,這是非常有用的。在這種情況下,無需創建 DataSet 對象。數據讀取器類似于連接的、僅向前移動的、只讀 ADO Recordset 對象。

作為參考,在使用 ADO 的 Office Visual Basic for Applications (VBA) 中,可以通過以下方法打開羅斯文示例 Access 數據庫,將數據從 Products 表復制到 Recordset 對象,并報告記錄集中第一條數據記錄的某些數據:

' Office VBA 和 ADO 代碼 - ADOCode.bas。
Public Sub ADOExample()

    ' 首先設置對 ADO 庫的引用。
    Dim objConn As ADODB.Connection
    Dim objRS As ADODB.Recordset
    
    Set objConn = New ADODB.Connection
    
    objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "User ID=Admin;" & _
        "Data Source=C:\Program Files\Microsoft " & _
        "Office\Office10\Samples\Northwind.mdb"
    objConn.Open
    
    Set objRS = objConn.Execute("SELECT * FROM Products")
    
    objRS.MoveFirst
    
    MsgBox Prompt:=objRS.Fields("ProductName").Value & ", " & _
        objRS.Fields("UnitsInStock").Value
        
    objRS.Close
    objConn.Close

End Sub

如果您以前在 ADO 中進行過編碼,則此 ADO 代碼是非常簡單的:

  • 聲明 ADO 的 Connection 對象和 Recordset 對象,它們分別引用數據庫的連接和數據庫的基礎數據。
  • Connection 對象的 ConnectionString 屬性設置為數據庫特定的 String 值,該值代表連接到數據庫(本例中為羅斯文數據庫)所需要的信息。
  • Connection 對象的 Open 方法建立了實際的數據庫連接。
  • Connection 對象的 Execute 方法從數據庫檢索數據,并將檢索到的數據放入 Recordset 對象。
  • Recordset 對象的 MoveFirst 方法移至記錄集中的第一條記錄。
  • Recordset 對象的 Fields 屬性引用記錄中的特定列,而 Field 對象的 Value 屬性將檢索字段中的實際數據。

作為比較,下面是一些用于控制臺應用程序的 Visual Basic .NET 示例代碼,使用 ADO.NET 執行大體相同的操作,但它并不將數據放入記錄集,而是由一個 ADO.NET 數據讀取器保持與數據的連接:

' Visual Basic .NET 和 ADO.NET 代碼 - ADONETCode.vb。
' 使用連接的 ADO.NET 數據訪問。
' 控制臺應用程序。
Imports System.Data.OleDb

Module Module1

    Sub Main()

        ' 首先設置對 System.Data.dll 的引用。
        Dim objConn As New OleDbConnection _
            ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "User ID=Admin;" & _
            "Data Source=C:\Program Files\Microsoft" & _
            "Office\Office10\Samples\Northwind.mdb")

        objConn.Open()

        Dim objCmd As New OleDbCommand _
            ("SELECT * FROM Products", objConn)
        Dim objDataReader As OleDbDataReader = objCmd.ExecuteReader

        objDataReader.Read()
        Console.Write(objDataReader.Item("ProductName") & ", " & _
            objDataReader.Item("UnitsInStock"))

    End Sub

End Module

下面是該代碼的工作方式:

  • 代碼 Imports System.Data.OleDb 有助于減少訪問對象或對象的成員時所需的工作量。例如,盡管可以在 ADO 中編寫 ADODB.Recordset 代碼,但通常并不這樣做,因為已經引用了 ADODB 庫。同樣,盡管可以在 ADO.NET 中編寫 System.Data.OleDb.OleDbConnection 代碼,但如果已經導入了與 OleDbConnection 對象關聯的名稱空間 System.Data.OleDb(假設我們已預先設置了對 System.Data.dll 的引用),也就不需要進行編碼。
  • 在 ADO 中,必須首先聲明一個 Connection 類型的對象,然后使用 ConnectionString 屬性定義連接信息。而在 .NET 中,我們使用參數化構造函數和初始值設定項的概念,只需一行代碼便可以聲明 OleDbConnection 類型的對象,并定義連接信息。
  • 與 ADO 類似,在 ADO.NET 中,使用 OleDbConnection 對象的 Open 方法建立實際的數據庫連接。
  • 接下來,聲明 ADO.NET 的 OleDbCommand 對象,以便存儲從數據庫檢索數據的命令。
  • 然后聲明 ADO.NET 的 OleDbDataReader 對象,從數據庫讀取數據。
  • 通過使用 OleDbCommand 對象的 ExecuteReader 方法,該代碼允許數據讀取器訪問數據庫中的特定數據。
  • OleDbDataReader 對象的 Read 方法將讀取數據庫中的第一條記錄。
  • Console.Write 方法將數據從特定列(使用 OleDbReader 對象的 Item 屬性)寫入命令窗口。

下面是另一段 Visual Basic .NET 示例代碼,執行與前面的 ADO.NET 示例相同的操作。但在這一示例中,數據將被復制到 ADO.NET 數據集,然后斷開與數據庫的連接:

' Visual Basic .NET 和 ADO.NET 代碼 - ADONETCode.vb。
' 使用斷開連接的 ADO.NET 數據訪問。
' 控制臺應用程序。
Imports System.Data.OleDb

Module Module1

    Sub Main()

        ' 首先設置對 System.Data.dll 的引用。
        Dim objConn As New OleDbConnection _
            ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "User ID=Admin;" & _
            "Data Source=C:\Program Files\Microsoft" & _
            "Office\Office10\Samples\Northwind.mdb")

        objConn.Open()

        Dim objAdapter As New OleDbDataAdapter _
            ("SELECT * FROM Products", objConn)
        Dim objDataSet As New DataSet()

        objAdapter.Fill(objDataSet)

        With objDataSet.Tables("Table").Rows(0)

            Console.Write(.Item("ProductName") & ", " _
                & .Item("UnitsInStock"))

        End With

    End Sub

End Module

下面是此代碼與前一 ADO.NET 示例的區別:

  • OleDbDataReader 對象類似,OleDbAdapter 對象也是從數據庫訪問數據,但這里使用了 OleDbAdapter 對象的 Fill 方法,將數據表和它們之間的關系從數據庫復制到 DataSet 對象。
  • DataSet 對象的 Tables 屬性訪問數據集的所有表,而 Rows 屬性訪問數據集中給定表的單個行。

可以在 Office VBA 中使用 ADO.NET 嗎?

雖然您可能希望在 Office VBA 中使用 ADO.NET 的新功能,但目前還不能這樣做。這是因為,如果運行 RegAsm.exe(.NET Frameworks SDK 中的程序集注冊工具)將 System.Data.dll 注冊為 COM(Office VBA 基于此技術),然后嘗試從 Office 引用生成的類型庫文件,則不會在 Office Visual Basic 的對象瀏覽器中顯示任何成員。這是因為 COM 不能識別核心的私有 ADO.NET 成員和參數化的構造函數。因此,至少在目前,還只能繼續在 Office VBA 中使用 ADO。

使用 Visual Studio .NET 數據訪問工具

Visual Studio .NET 提供了許多便利工具用于訪問 Office 數據,包括創建可重復使用的數據連接、數據庫項目以及數據表單向導。

數據連接

數據連接允許您一次性定義數據庫連接的詳細信息,然后在多個解決方案中重復使用該信息。下面的示例介紹如何在 Visual Studio .NET 中創建可重復使用的數據連接:

  1. Tools(工具)菜單上,單擊 Connect to Database(連接到數據庫)。將顯示 Data Link Properties(數據鏈接屬性)對話框。
  2. Provider(提供程序)選項卡上,單擊相應的數據提供程序,然后單擊 Next(下一步)。例如,要連接到 Access 的羅斯文示例數據庫,請單擊 Microsoft Jet 4.0 OLE DB Provider(Microsoft Jet 4.0 OLE DB 提供程序)。
  3. 在所選數據提供程序的 Connection(連接)選項卡中填入信息。例如,對于羅斯文示例數據庫,請單擊 Select or enter a database name(選擇或輸入數據庫名稱)框旁邊的 ... 按鈕,瀏覽至 Northwind.mdb,然后單擊 Open(打開)。
  4. 單擊 Test Connection測試連接)。如果連接成功,單擊 OK(確定)。否則,請重新檢查 Connection(連接)選項卡上的信息。
  5. 單擊 OK(確定),關閉 Data Link Properties(數據鏈接屬性)對話框。

這樣就有了一個可以添加到 Visual Studio .NET 項目的可重復使用的數據連接。

下面基于這些步驟給出一個示例,說明如何創建 ADO.NET 對象,這些對象能夠與 Server Explorer服務器資源管理器)窗口中的現有數據連接進行交互操作:

  1. Windows 應用程序項目的 Designer(設計器)視圖中,在 View(視圖)菜單上,單擊 Server Explorer(服務器資源管理器),展開所需的數據連接,然后將表、視圖或存儲過程拖動到設計界面上。Visual Studio .NET 將創建一個 OleDbConnection/SqlConnection 對象(取決于數據庫的類型)、一個 OleDbDataAdapter/SqlDataAdapter 對象和四個 OleDbCommand/SqlCommand 對象,用于選擇、插入、更新和刪除數據。
  2. 右擊 OleDbDataAdapter/SqlDataAdapter 對象,并單擊 Generate Dataset(生成數據集)。在本例中,選擇 New(新建),保留 DataSet1 的默認設置,選中要添加到數據集的表,選中 Add this dataset to the designer(將此數據集添加到設計器中),然后單擊 OK(確定)。Visual Studio .NET 將創建一個 DataSet 對象。
  3. 右擊 OleDbDataAdapter/SqlDataAdapter 對象,并單擊 Preview Data(預覽數據),單擊 Fill Dataset(填充數據集),然后單擊 Close(關閉)。
    注意:在 Visual Studio .NET Beta 2 中,不會顯示 Fill Dataset(填充數據集)按鈕,以便生成實際填充 Dataset 對象的代碼??赡苄枰謩酉?Form_LoadPage_Load 事件添加代碼,如下所示:Me.OleDbDataAdapter1.Fill(DataSetName11)。

下面的示例介紹如何在 Windows 窗體中添加數據網格,并綁定到前一示例中生成的現有數據集:

  1. Designer(設計器)視圖中,單擊工具欄上的 Windows Forms(Windows 窗體)選項卡,然后雙擊 DataGrid。
  2. 在 DataGrid1 的 Properties(屬性)窗口中,為 DataSource 屬性選擇 DataSet11,然后為 DataMember 屬性選擇表。
  3. 運行應用程序。
  4. 如果 DataGrid1 中未顯示數據,請在 Form_Load 事件中添加類似如下的代碼:Me.OleDbDataAdapter1.Fill(DataSetName11)。
    提示:要在 Server Explorer(服務器資源管理器)窗口中沒有現有數據連接的情況下創建 ADO.NET 對象,請執行以下步驟:
    1. 在設計視圖中,單擊工具欄上的 Data(數據)選項卡。請注意,這在 Code(代碼)視圖中無效。
    2. 將 ADO.NET 對象拖動到設計界面上。
    3. 右擊 ADO.NET 對象,并單擊 Properties(屬性)。
    4. 填寫所選 ADO.NET 對象的相應屬性。

數據庫項目

Visual Studio .NET 數據庫項目允許您快速創建面向數據庫的解決方案。下面的示例介紹如何在 Visual Studio .NET 中創建數據庫項目:

  1. File(文件)菜單上,指向 New(新建),然后單擊 Project(項目)。
  2. Project Types(項目類型)窗格中,展開 Other Projects(其他項目),然后單擊 Database Projects(數據庫項目)。
  3. Templates模板)窗格中,單擊 Database Project(數據庫項目)。
  4. 填寫 Name(名稱)和 Location(位置)框,然后單擊 OK(確定)。
  5. 單擊 Add to Solution(添加到解決方案)按鈕將此項目添加到現有解決方案;或單擊 Close Solution(關閉解決方案)按鈕,創建獨立的解決方案。
  6. Add Database Reference(添加數據庫引用)對話框中,選擇現有的數據連接,或單擊 Add New Reference(添加新引用),以添加新的數據連接。如果單擊 Add New Reference(添加新引用),請執行上一節中的步驟完成 Data Link Properties(數據鏈接屬性)對話框。如果使用此方法添加新的數據連接,數據連接將顯示在 Server Explorer(服務器資源管理器)窗口中。

數據表單向導

Visual Studio .NET 數據表單向導允許您快速連接到數據庫,并生成簡單的用戶界面,用于顯示數據并與數據進行交互。要使用數據表單向導,請執行以下步驟:

  1. 在 Windows 應用程序項目中,在 Project(項目)菜單上,單擊 Add Windows Form(添加 Windows 窗體)。
  2. Templates(模板)窗格中,單擊 Data Form Wizard(數據窗體向導),單擊 Open(打開),然后單擊 Next(下一步)。
  3. Create a new dataset named(創建新數據集)框中,鍵入 DataSet1,然后單擊 Next(下一步)。
  4. 選擇現有的數據連接或創建新數據連接,然后單擊 Next(下一步)。
  5. 選擇要向 DataSet1 填充的項,然后單擊 Next(下一步)。
  6. 如果選擇多項,請定義各項之間的關系,然后單擊 Next(下一步)。
  7. 定義要在表單中顯示的表和列,然后單擊 Next(下一步)。
  8. 選擇顯示樣式選項,然后單擊 Finish(完成)。
    注意:請確保將新數據表單設置為啟動表單,方法如下:在 Project(項目)菜單中,單擊 Properties(屬性)。展開 Common Properties(通用屬性)文件夾,單擊 General(常規),在 Startup object(啟動對象)列表中選擇該數據表單,然后單擊 OK(確定)。
    注意:請確保將 DataSet1 中的數據綁定到數據表單,這可以通過向數據表單的 Load 事件插入以下代碼來實現:Me.OleDbDataAdapter1.Fill(objDataSet1)
  9. 運行應用程序:在 Debug(調試)菜單上,單擊 Run(運行)。

擴展的 ADO.NET 代碼示例

為了向您演示更多的 ADO.NET 代碼,在本月專欄的最后,我將介紹幾個在 ADO.NET 中創建的擴展的代碼示例。

使用 DataReader 對象以僅向前移動的、只讀的格式訪問數據

很多時候,您只是希望簡單地瀏覽數據,而并不需要在數據間來回瀏覽,也不需要更改數據(我們將此稱為“流水數據”)。ADO.NET 的 DataReader 對象是專門為此設計的。下面是我編寫的一段示例代碼,可以逐個讀取連接的數據庫中的所有選定數據:

' Visual Basic .NET 代碼。
' 控制臺應用程序。
' 引用:
'   System
'   System.Data
'   System.XML

Imports System.Data.OleDb                   ' 用于 OleDb 對象。
Imports Microsoft.VisualBasic.ControlChars  ' 用于 CrLf 常量。

Module Module1

    Sub Main()

        ' 創建并初始化 OleDbConnection、OleDbCommand
        ' 和 OleDbDataReader 對象。
        Dim objConn As New _
            OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "User ID=Admin;" & _
            "Data Source=C:\Program Files\Microsoft" & _
            "Office\Office10\Samples\Northwind.mdb")

        objConn.Open()

        ' 執行命令并將數據讀取器附加到
        ' 所選數據。
        Dim objCmd As New OleDbCommand("SELECT * FROM Products", _
            objConn)
        Dim objReader As OleDbDataReader = objCmd.ExecuteReader

        ' 讀取數據并列出值。 
        Call ReadData(objReader)

    End Sub

    Public Sub ReadData(ByVal objReader As OleDbDataReader)

        ' 目的:列出給定數據讀取器的數據值。 
        ' 接受:objReader - 數據讀取器。 

        Dim intField As Integer             ' 行中的當前字段。
        Dim intColumn As Integer            ' 當前列的名稱。
        Dim blnColumns As Boolean = False   ' 列名稱是否已
                                            ' 列出。

        With objReader

            ' 一次讀取一行,直至文件末尾。
            Do While .Read = True

                For intField = 0 To .FieldCount - 1

                    ' 首先列出列名稱。 
                    If blnColumns = False Then

                        For intColumn = 0 To .FieldCount - 1

                            If intColumn = .FieldCount - 1 Then
                                Console.Write(.GetName(intColumn) & _
                                    CrLf)
                            Else
                                Console.Write(.GetName(intColumn) & _
                                    ", ")
                            End If

                        Next intColumn

                        ' 只列出一次列名稱。 
                        blnColumns = True

                    End If

                    ' 列出當前行中每個字段的值。
                    If intField = .FieldCount - 1 Then
                        Console.Write(.Item(intField) & CrLf)
                    Else
                        Console.Write(.Item(intField) & ", ")
                    End If

                Next intField

            Loop

        End With

        ' 暫停,以便用戶在控制臺窗口中查看數據。 
        Console.Write("按任意鍵繼續...")
        Console.Read()

    End Sub

End Module

下面是該代碼的工作方式:

  • 正如前面的代碼示例所示,Imports 代碼(例如,Imports System.Data.OleDb)有助于減少訪問對象或對象的成員時所需的工作量。類似地,對 OleDbConnection、OleDbCommandOleDbDataReader 對象進行聲明和初始化,以分別代表數據庫連接、數據記錄和記錄游標。此代碼的真正核心是 ReadData 子例程。
  • Do 循環使用 OleDbDataReader 對象的 Read 方法一次讀取一行數據,直到該方法返回 False(表示已沒有其他數據可讀?。?。
  • OleDbDataReader 對象的 FieldCount 屬性返回數據行中數據字段(列)的數目。如果是第一行數據,則在列上調用 OleDbDataReader 對象的 GetName 屬性,以返回列的名稱。
  • OleDbDataReader 對象的 Item 屬性與 FieldCount 屬性結合,使用一個索引編號返回數據行中每個數據字段的值。

使用 DataAdapter、DataSet、DataTable、DataRow 和 DataColumn 對象處理數據集

ADO.NET 的 DataSet 對象是為斷開連接的數據而設計的。您可以在一個數據集中模擬整個數據庫的結構和數據,包括表、行、列、字段,甚至關系。處理完數據后,可以使數據集中的數據與原始數據庫中的數據同步。下面是我編寫的一段示例代碼,可以逐個讀取斷開連接的數據集中的所有數據。

' Visual Basic .NET 代碼。
' 控制臺應用程序。
' 引用:
'   System
'   System.Data
'   System.XML

Imports System.Data.OleDb                   ' 用于 OleDb 對象。
Imports Microsoft.VisualBasic.ControlChars  ' 用于 CrLf 常量。

Module Module1

    Sub Main()

        ' 創建并初始化 OleDbDataAdapter 和 DataSet 對象。
        Dim objAdapter As New OleDbDataAdapter _
            ("SELECT * FROM Products", _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "User ID=Admin;" & _
            "Data Source=C:\Program Files\Microsoft" & _
            "Office\Office10\Samples\Northwind.mdb")
        Dim objDataSet As New DataSet()

        ' 將所選數據復制到數據集。
        objAdapter.Fill(objDataSet)

        ' 列出數據集中的數據值。
        Call ListData(objDataSet)

    End Sub

    Public Sub ListData(ByVal objDataSet As DataSet)

        ' 目的:列出給定數據集的數據值。 
        ' 接受:objDataSet - 數據集。

        Dim objTable As DataTable
        Dim intRow, intColumn As Integer

        ' 數據集中可能包含有多個表。 
        For Each objTable In objDataSet.Tables

            With objTable

                Console.Write("表" & _
                    .TableName "中的數據" & ":" & CrLf)

                ' 首先列出列名稱。 
                For intColumn = 0 To .Columns.Count - 1

                    If intColumn = .Columns.Count - 1 Then
                        Console.Write(.Columns(intColumn).ColumnName _
                            & CrLf)
                    Else
                        Console.Write(.Columns(intColumn).ColumnName _
                            & ", ")
                    End If

                Next intColumn

                ' 按行列出數據...
                For intRow = 0 To .Rows.Count - 1

                    ' ...然后按字段列出每行中的數據。
                    For intColumn = 0 To _
                        .Rows(intRow).ItemArray.Length - 1

                        If intColumn = _
                                .Rows(intRow).ItemArray.Length - 1 Then
                            Console.Write(.Rows(intRow). _
                                ItemArray(intColumn) _
                                & CrLf)
                        Else
                            Console.Write(.Rows(intRow). _
                                ItemArray(intColumn) & ", ")
                        End If

                    Next intColumn

                Next intRow

            End With

        Next objTable

        ' 暫停,以便用戶在控制臺窗口中查看數據。 
        Console.Write("按任意鍵繼續...")
        Console.Read()

    End Sub

End Module

下面是該代碼的工作方式:

  • 同樣,Imports 代碼(例如,Imports System.Data.OleDb)有助于減少訪問對象或對象的成員時所需的工作量。類似地,對 OleDbDataAdapter DataSet 對象進行聲明和初始化,分別代表數據庫與數據集之間的適配器以及數據集。OleDbAdapter 對象的 FillData 方法將數據庫中的數據復制到數據集。此代碼的核心是 ListData 子例程。
  • 通過使用 DataSet 對象的 Tables 屬性,最外層的 For...Each 循環將遍歷數據集中的每個表,并將每個表作為 DataTable 對象返回。
  • DataTable 對象的 Columns 屬性返回一個 DataColumnCollection,代表表中的所有列。通過結合使用 Columns 屬性和一個索引編號(即結合 DataColumnCollection 集合的 Count 屬性,如代碼中所示),將返回一個 DataColumn 對象。DataColumn 對象的 ColumnName 屬性返回列的名稱。
  • 同樣,DataTable 對象的 Rows 屬性返回一個 DataRowCollection,代表表中的所有行。通過結合使用 Rows 屬性和一個索引編號(即結合 DataRowCollection 集合的 Count 屬性,如代碼中所示),將返回一個 DataRow 對象。DataRow 對象的 ItemArray 屬性返回一個 Object 類型的數組,代表數據行中的每個值。通過結合使用 ItemArray 屬性和一個索引編號(即結合 DataColumnCollection 集合的 Count 屬性,如代碼中所示),將返回單個數據字段值。

更多信息

有關 ADO.NET 的更多信息,請參閱以下內容:

與以往一樣,請定期訪問 Office 開發人員中心(英文),以查找有關 Office 解決方案開發的信息和技術文章。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97