引言 在 Microsoft
NET 應用程序中使用 Microsoft Office 數據時所需的大多數任務與使用任何其他數據時的任務相同
創建連接
根據使用數據時的需要創建 DataReader 或 DataAdapter
創建一個或多個 DataSet 來封裝相關數據的 DataTable
等等
因此
我不打算在此重新編寫 ADO
NET 文檔
本文的目的在於
提供按 Office 數據源編寫基礎數據檢索代碼時所需的缺失或廣為分布的信息段
好像那些知道 Jet 的奇特之處的人士卻不是很熟悉 ADO
NET
而大部分的 ADO
NET 專業人士不是很了解支持 Office 可編程序性的技術
因此提供一個快速的概述
希望可以解答我所見到的這兩方的常見問題
首先讓我們討論一下連接到 Microsoft Excel 和 Microsoft Access 的數據並從中檢索數據的基礎
我認為此領域中存在最大的問題
通常一旦人們能夠解決該問題
Office 特定問題將會得到解決
而且其余問題主要集中於如何使用 ADO
NET
下面我將討論如何使用 OleDbConnection 對象的 GetOleDbSchemaTable 方法來檢索關於運行時 Access 或 Excel 數據的架構信息
這樣
您可以避開關於數據源的硬編碼信息
數據源非常有用
從中可以獲取數據
建立連接 如果要連接到 Excel 電子表格或 Access 數據庫
則需要創建一個 OleDbConnection 對象
並向其傳遞一個帶有目標數據源詳細信息的連接字符串
您需要為 Provider 屬性指定 Jet
OLE DB 提供程序
連接到 Access 讓我們看一看用於 Access 數據庫的典型連接字符串
Provider=Microsoft
Jet
OLEDB
;Data Source= C:\Databases\mymusic
mdb
這非常簡單
它僅指定 Provider 和 Data Source 屬性
如上所述
Provider 是 Jet
提供程序
而 Data Source 屬性包含數據庫的完全限定路徑
當然
您甚至還需要確保 Access 數據庫的安全
對不對?這樣
您還需要指定工作組信息文件(默認情況下為 system
mdw)的路徑
並提供用戶 ID 和密碼
Provider=Microsoft
Jet
OLEDB
;Data
& _
Source=C:\Databases\mymusic
mdb;
& _
Jet OLEDB:System database=
& _
C:\Databases\system
mdw;
& _
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=Microsoft
Jet
OLEDB
;
& _
Data Source=C:\Spreadsheets\calculations
xls;
& _
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
如果想要大體上了解一下 ADO
NET
請參閱《
NET Framework Developer
s Guide》的 Accessing Data with ADO
NET 部分
它會為您帶來閱讀的樂趣
檢索 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 Artists
ArtistName
Genres
Genre
Labels
Label
Tracks
Public AS Track
Releases
ReleaseName
FROM (Labels INNER JOIN ((Artists
記住這些要點
讓我們來看一個示例
Imports System
Imports System
Data
Imports System
Data
OleDb
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\system
mdw;
& _
Data Source=C:\Databases\mymusic
mdb;
& _
Provider=Microsoft
Jet
OLEDB
;
& _
User ID=
& UID &
;Password=
& pwd
打開連接
conn
ConnectionString = connString
conn
Open()
設置命令屬性
cmd
Connection = conn
cmd
CommandText =
SELECT * from music
& _
WHERE ArtistName =
& artist &
獲取 OleDbDataReader
並對其進行一些處理
musicReader = _
cmd
ExecuteReader(CommandBehavior
CloseConnection)
Try
While (musicReader
Read)
處理數據
End While
Finally
musicReader
Close()
End Try
Catch ex As Exception
錯誤處理
End Try
End Function
GetAccessData
檢索 Excel 數據 關於列名稱
Excel 和 Access 一樣具有相同的保留字限制
一般而言
如果記住 SQL 保留字
並在創建可能用作數據源的任何對象時避開保留字
則會更好
還有一點需要考慮
Excel 的語法同樣也有奇特之處
對代碼影響最大的項是用於引用要返回的數據集的語法
注意
對於最簡單的 Excel 數據檢索
請使用維護類似表格式的電子表格
第一個選項是指定工作表和該表中的單元格集(可選)
需要確保工作表名稱後跟美元符號和單元格集(可選)
通過使用冒號分隔集合中的起始單元格和終止單元格
來指定此單元格集
然後
使用括號將整個數據標識字符串括起
使用此類型語法的 SELECT 語句可能如下所示
SELECT SalesMonth
TotalSales
PercentageChange
Year
FROM [Sheet
$A
:E
]
另一個選項是在 Excel 中創
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25556.html