熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

從 .NET 應用程序訪問 Microsoft Office 數據

2013-11-23 18:40:19  來源: Java核心技術 

  引言
  在 Microsoft NET 應用程序中使用 Microsoft Office 數據時所需的大多數任務與使用任何其他數據時的任務相同 創建連接根據使用數據時的需要創建 DataReader 或 DataAdapter創建一個或多個 DataSet 來封裝相關數據的 DataTable等等因此我不打算在此重新編寫 ADONET 文檔本文的目的在於提供按 Office 數據源編寫基礎數據檢索代碼時所需的缺失或廣為分布的信息段好像那些知道 Jet 的奇特之處的人士卻不是很熟悉 ADONET而大部分的 ADONET 專業人士不是很了解支持 Office 可編程序性的技術因此提供一個快速的概述希望可以解答我所見到的這兩方的常見問題
  
  首先讓我們討論一下連接到 Microsoft Excel 和 Microsoft Access 的數據並從中檢索數據的基礎我認為此領域中存在最大的問題 通常一旦人們能夠解決該問題Office 特定問題將會得到解決而且其余問題主要集中於如何使用 ADONET下面我將討論如何使用 OleDbConnection 對象的 GetOleDbSchemaTable 方法來檢索關於運行時 Access 或 Excel 數據的架構信息這樣您可以避開關於數據源的硬編碼信息數據源非常有用從中可以獲取數據
  
  建立連接
  如果要連接到 Excel 電子表格或 Access 數據庫則需要創建一個 OleDbConnection 對象並向其傳遞一個帶有目標數據源詳細信息的連接字符串您需要為 Provider 屬性指定 Jet OLE DB 提供程序
  
  連接到 Access
  讓我們看一看用於 Access 數據庫的典型連接字符串
  
  Provider=MicrosoftJetOLEDB;Data Source= C:\Databases\mymusicmdb
  
  這非常簡單 它僅指定 Provider 和 Data Source 屬性如上所述Provider 是 Jet 提供程序而 Data Source 屬性包含數據庫的完全限定路徑
  
  當然您甚至還需要確保 Access 數據庫的安全對不對?這樣您還需要指定工作組信息文件(默認情況下為 systemmdw)的路徑並提供用戶 ID 和密碼
  
  Provider=MicrosoftJetOLEDB;Data & _
  Source=C:\Databases\mymusicmdb; & _
  Jet OLEDB:System database= & _
  C:\Databases\systemmdw; & _
  User ID=UserX;Password=UserXPassword
  
  請注意指定控制 Access 數據庫安全性的 mdw 文件時需要使用 Jet OLE DB 特定的屬性如果希望更好地控制數據庫的行為則可以浏覽 Jet OLE DB 提供程序(該提供程序位於 Appendix B:Microsoft Jet OLE DB Properties Reference)所提供的其他屬性來控制鎖定行為和如何處理特定類型的失敗等等請注意只有那些可以在連接字符串中設置的屬性才可以訪問指定提供程序的屬性之前需要連接處於打開狀態否則將無法設置這些屬性
  
  可以使用 Microsoft® Visual Studio® NET來獲取包括所有的 Jet OLE DB 提供程序設置完整的 Access 連接字符串的模板在服務器資源管理器中創建一個與 Access 數據庫的數據連接然後使用工具箱的數據部分創建一個 OleDbConnection 對象得到的對象的 ConnectionString 屬性會包含默認的所有 Jet OLE DB 提供程序屬性
  
  連接到 Excel
  現在讓我們看看 Excel 電子表格的典型連接字符串的外觀
  
  Provider=MicrosoftJetOLEDB; & _
  Data Source=C:\Spreadsheets\calculationsxls; & _
  Extended Properties=Excel
  
  在連接到 Excel 文件的情況下可以看到我們必須在連接字符串中使用 Extended Properties 屬性以及 Provider 和 Data Source如果是 Excel 和更高版本則使用Excel 設置如果希望獲取此屬性的其他可接受值的更多信息請參閱 ADO Provider Properties and Settings 的Extended Properties Property Settings部分
  
  您會說但是 Excel 中的安全性怎麼樣?恐怕沒有激動人心的消息您無法打開與受密碼保護的電子表格的連接除非已手動地在 Excel 中打開此電子表格(有關詳細信息請參閱 XL:Could Not Decrypt File Error with Password Protected File)描述的錯誤出現於 Excel ODBC 提供程序但是在 Jet OLE DB 提供程序中該行為相同其他選項為刪除電子表格的密碼並使用某些其他安全機制(例如限制文件所在文件夾的權限)來控制訪問
  
  不幸的是您也無法使用 Visual Studio NET 獲取 Excel 連接字符串的模板進行一些小小的嘗試即可創建 Excel 數據連接但是您會發現其屬性不可編輯而且 ConnectionString 屬性將保留空白 這是 IDE(集成的開發環境)中的奇特之處有關詳細信息請參閱 PRB:Cannot Configure Data Connection to Excel Files in Visual Studio NET這樣對於 Excel 連接基本上都需要自己進行工作但在這種情況下對連接進行編碼就像在用戶界面 (UI) 中創建連接一樣簡單
  
  檢索數據
  現在已經明白了如何建立與 Office 數據源的連接就讓我們看看它是怎樣檢索數據的出於簡單性的考慮我打算使用 OleDbConnection/OleDbCommand/OleDbDataReader 數據檢索方案相同的方法在稍稍調整之後可以用於構建 OleDbDataAdapter 並填充 DataSet如果想要大體上了解一下 ADONET請參閱《NET Framework Developers Guide》的 Accessing Data with ADONET 部分它會為您帶來閱讀的樂趣
  
  檢索 Access 數據
  編寫 Access 數據檢索代碼時請切記指定 SQL 時必須遵循的語法具有某些特性無法在圖形 UI 中創建 Access 查詢無法訪問 SQL 視圖無法復制得到的 SQL 語句並將其粘貼到代碼中這本應非常簡單的生成的 SQL 代碼通常具有一部分但不是全部的所需語法必須在 Access 開發環境中編寫代碼的任何人都會知道這一點但是對於一般的 NET 客戶端應用程序開發人員而言這算的上是新聞最讓人煩心的是條件表達式它需要以某種方式分隔 WHERE 字句中的特定類型的數據日期和時間值必須使用數字記號 (#) 進行分隔文本值必須使用單引號 () 進行分隔例如
  
  SELECT City Neighborhood SalePrice MonthsOnMarket
  FROM RealEstate
  WHERE ListingDate > #//#
  
  有關這些問題的詳細信息請參閱 Date and Time Criteria Expressions
  
  需要記住的另一點看上去好像顯而易見但是卻使人們感到困惑所以我將討論這一點請確保 Access 表的列名稱不使用保留字可以在 SQL Reserved Words 處查詢保留字如果使用任何保留字我想說的是如果可能就重命名列我知道如果您已使用數據庫該操作則不太可能所以必要時可以創建查詢並將其用作有問題列的表的替換查詢僅使用 AS 重命名列就如
  
  SELECT ArtistsArtistName GenresGenre LabelsLabel
  TracksPublic AS Track ReleasesReleaseName
  FROM (Labels INNER JOIN ((Artists
  
  記住這些要點讓我們來看一個示例
  
  Imports System
  Imports SystemData
  Imports SystemDataOleDb
  
  Public Function GetAccessData(ByVal UID As String _
  ByVal pwd As String ByVal artist As String)
  
  Dim conn As New OleDbConnection
  Dim musicReader As OleDbDataReader
  Dim cmd As New OleDbCommand
  Dim connString As String
  Dim i As Integer
  
  Try
   設置連接字符串
  connString = Jet OLEDB:System database= & _
  C:\Databases\systemmdw; & _
  Data Source=C:\Databases\mymusicmdb; & _
  Provider=MicrosoftJetOLEDB; & _
  User ID= & UID & ;Password= & pwd
  
   打開連接
  connConnectionString = connString
  connOpen()
  
  設置命令屬性
  cmdConnection = conn
  cmdCommandText = SELECT * from music & _
  WHERE ArtistName = & artist &
  
   獲取 OleDbDataReader
   並對其進行一些處理
  musicReader = _
  cmdExecuteReader(CommandBehaviorCloseConnection)
  Try
  While (musicReaderRead)
  處理數據
  End While
  Finally
  musicReaderClose()
  End Try
  
  Catch ex As Exception
  錯誤處理
  End Try
  
  End Function GetAccessData
  
  檢索 Excel 數據
  關於列名稱Excel 和 Access 一樣具有相同的保留字限制一般而言如果記住 SQL 保留字並在創建可能用作數據源的任何對象時避開保留字則會更好還有一點需要考慮
  
  Excel 的語法同樣也有奇特之處對代碼影響最大的項是用於引用要返回的數據集的語法
  
  注意對於最簡單的 Excel 數據檢索請使用維護類似表格式的電子表格
  
  第一個選項是指定工作表和該表中的單元格集(可選)需要確保工作表名稱後跟美元符號和單元格集(可選)通過使用冒號分隔集合中的起始單元格和終止單元格來指定此單元格集然後使用括號將整個數據標識字符串括起使用此類型語法的 SELECT 語句可能如下所示
  
  SELECT SalesMonth TotalSales PercentageChangeYear
  FROM [Sheet$A:E]
  
  另一個選項是在 Excel 中創
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25556.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.