使用ADO.NET解鎖 Microsoft Access資料(一)

來源:互聯網
上載者:User
access|ado|資料 使用ADO.NET解鎖 Microsoft Access資料

作者:微軟中國  

Microsoft® Office 提供了多種儲存和管理資料的功能和工具,例如,Data Access Objects (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 對象。
OleDbCommand 和 SqlDbCommand 對象,代表將要直接發送到資料庫的 SQL 文本字串,類似於 ADO 的 Command 對象。
OleDbDataAdapter 和 SqlDataAdapter 對象,用於儲存資料庫的 SELECT、INSERT、UPDATE 和 DELETE 命令。這些對象可以作為資料庫和 DataSet 對象之間的中介。可以使用 Fill 方法填充 DataSet 對象並從資料庫中斷連線,然後使用 Update 方法重新串連到資料庫,並將在 DataSet 對象中所做的更改儲存回資料庫。
DataSet 對象包含實際資料的副本,類似於中斷連線的 ADO Recordset 對象。DataSet 對象可以包含 DataRelation 對象和 Contraint 對象,這兩個對象分別代表資料表之間的關係和這些表中資料的約束。DataSet 對象還可以包含 DataTable 對象,該對象又可以包含 DataColumn 和 DataRow 對象。使用 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 中建立可重複使用的資料連線:
在 Tools(工具)菜單上,單擊 Connect to Database(串連到資料庫)。將顯示 Data Link Properties(資料連結屬性)對話方塊。
在 Provider(提供者)選項卡上,單擊相應的資料提供者,然後單擊 Next(下一步)。例如,要串連到 Access 的羅斯文樣本資料庫,請單擊 Microsoft Jet 4.0 OLE DB Provider(Microsoft Jet 4.0 OLE DB 提供者)。
在所選資料提供者的 Connection(串連)選項卡中填入資訊。例如,對於羅斯文樣本資料庫,請單擊 Select or enter a database name(選擇或輸入資料庫名稱)框旁邊的 ... 按鈕,瀏覽至 Northwind.mdb,然後單擊 Open(開啟)。
單擊 Test Connection(測試連接)。如果串連成功,單擊 OK(確定)。否則,請重新檢查 Connection(串連)選項卡上的資訊。
單擊 OK(確定),關閉 Data Link Properties(資料連結屬性)對話方塊。

這樣就有了一個可以添加到 Visual Studio .NET 項目的可重複使用的資料連線。
下面基於這些步驟給出一個樣本,說明如何建立 ADO.NET 對象,這些對象能夠與 Server Explorer(伺服器總管)視窗中的現有資料連線進行互動操作:
在 Windows 應用程式項目的 Designer(設計器)視圖中,在 View(視圖)菜單上,單擊 Server Explorer(伺服器總管),展開所需的資料連線,然後將表、視圖或預存程序拖動到設計介面上。Visual Studio .NET 將建立一個 OleDbConnection/SqlConnection 對象(取決於資料庫的類型)、一個 OleDbDataAdapter/SqlDataAdapter 對象和四個 OleDbCommand/SqlCommand 對象,用於選擇、插入、更新和刪除資料。
右擊 OleDbDataAdapter/SqlDataAdapter 對象,並單擊 Generate Dataset(產生資料集)。在本例中,選擇 New(建立),保留 DataSet1 的預設設定,選中要添加到資料集的表,選中 Add this dataset to the designer(將此資料集添加到設計器中),然後單擊 OK(確定)。Visual Studio .NET 將建立一個 DataSet 對象。
右擊 OleDbDataAdapter/SqlDataAdapter 對象,並單擊 Preview Data(預覽資料),單擊 Fill Dataset(填充資料集),然後單擊 Close(關閉)。
注意:在 Visual Studio .NET Beta 2 中,不會顯示 Fill Dataset(填充資料集)按鈕,以便產生實際填充 Dataset 對象的代碼。可能需要手動向 Form_Load 或 Page_Load 事件添加代碼,如下所示:Me.OleDbDataAdapter1.Fill(DataSetName11)。

下面的樣本介紹如何在 Windows 表單中添加資料格,並綁定到前一樣本中產生的現有資料集:
在 Designer(設計器)視圖中,單擊工具列上的 Windows Forms(Windows 表單)選項卡,然後雙擊 DataGrid。
在 DataGrid1 的 Properties(屬性)視窗中,為 DataSource 屬性選擇 DataSet11,然後為 DataMember 屬性選擇表。
運行應用程式。
如果 DataGrid1 中未顯示資料,請在 Form_Load 事件中添加類似如下的代碼:Me.OleDbDataAdapter1.Fill(DataSetName11)。
提示:要在 Server Explorer(伺服器總管)視窗中沒有現有資料連線的情況下建立 ADO.NET 對象,請執行以下步驟:
在設計檢視中,單擊工具列上的 Data(資料)選項卡。請注意,這在 Code(代碼)視圖中無效。
將 ADO.NET 對象拖動到設計介面上。
右擊 ADO.NET 對象,並單擊 Properties(屬性)。
填寫所選 ADO.NET 對象的相應屬性。
資料庫專案

Visual Studio .NET 資料庫專案允許您快速建立面向資料庫的解決方案。下面的樣本介紹如何在 Visual Studio .NET 中建立資料庫專案:
在 File(檔案)菜單上,指向 New(建立),然後單擊 Project(項目)。
在 Project Types(項目類型)窗格中,展開 Other Projects(其他項目),然後單擊 Database Projects(資料庫專案)。
在 Templates(模板)窗格中,單擊 Database Project(資料庫專案)。
填寫 Name(名稱)和 Location(位置)框,然後單擊 OK(確定)。
單擊 Add to Solution(添加到解決方案)按鈕將此項目添加到現有解決方案;或單擊 Close Solution(關閉解決方案)按鈕,建立獨立的解決方案。
在 Add Database Reference(添加資料庫引用)對話方塊中,選擇現有的資料連線,或單擊 Add New Reference(添加新引用),以添加新的資料連線。如果單擊 Add New Reference(添加新引用),請執行上一節中的步驟完成 Data Link Properties(資料連結屬性)對話方塊。如果使用此方法添加新的資料連線,資料連線將顯示在 Server Explorer(伺服器總管)視窗中。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。