- 安裝並驗證 ACE 提供者(Microsoft.ACE.OLEDB),並與體系結構相符 PowerShell的.
- 檢查登錄中的提供程序,使用 UDL 檔案進行測試,如果失敗則修正 ProgID/CLSID。
- 使用 System.Data.OleDb 和 OleDbDataAdapter 可靠地載入/更新 Access 資料。
- 使用 PowerShell 中的服務帳戶和安全性憑證自動執行腳本而無需提示。

如果您嘗試從 PowerShell 開啟 Access 資料庫並遇到下列訊息 “找不到提供者。它可能未正確安裝。”,你並不孤單。這個錯誤很常見,通常有兩個常見原因:未安裝 Access OLE DB 提供者 (ACE),或兩者之間有架構衝突 已安裝 32/64 位元 PowerShell 和驅動程式.
在本指南中,您將詳細、準確地了解如何連接到 Microsoft Access 運用 系統.數據.OleDb 在 PowerShell 中,如何驗證 OLE DB 提供者是否已正確安裝(包括其登錄項目、ProgID 和 DLL),如何使用 UDL 檔案輕鬆測試,以及如何自動化查詢和憑證,以便腳本在背景執行而無需幹預。此外,我們將探討 OleDb資料適配器 以及 OLE DB、ODBC、ADO 和 ADO.NET 之間的區別,這樣您就不會再陷入黑暗之中。
為什麼我在 PowerShell 中收到提供者錯誤?
嘗試使用 OLE DB 從 PowerShell 開啟 Access 時出現的典型錯誤訊息是: “找不到供應商”。當系統中不存在 Access ACE 提供者、未正確註冊或體系結構不符(例如,您安裝了 32 位元 ACE 並執行 64 位元 PowerShell,反之亦然)時,就會發生這種情況。
對於 Access,您需要的提供者是 微軟.ACE.OLEDB最常見的版本是 Microsoft.ACE.OLEDB.12.0 y Microsoft.ACE.OLEDB.16.0 (與 Microsoft Access 資料庫引擎/Office 一起安裝)。如果您的資料庫是較舊的 .mdb 文件,您也可以使用 Microsoft.Jet.OLEDB.4.0 在仍然支援它的系統上,儘管今天 ACE 是 .mdb 最安全的選擇,並且 .accdb.
避免將其與 SQL Server OLE DB 提供者混淆。 MSOLEDBSQL (適用於 SQL Server 的 Microsoft OLE DB 驅動程式)和 SQLNCLI (SQL Server Native Client)適用於 SQL Server,不適用於 Access。對於 Access,您需要 ACE;對於 SQL Server, MSOLEDBSQL 是今天推薦的。
安裝、架構和初步測試
在編寫程式碼之前,請確認已安裝正確的提供程序,並且體系結構相符。如果您執行的是 PowerShell x64,則 ACE 提供者必須是 x64;如果您使用的是 PowerShell x86,則需要 32 位元 ACE。 跨架構是大多數錯誤的根源.
檢查電腦上可用的 OLE DB 提供者的一種非常快速的方法是建立 UDL 檔案。 .udl 顯示已安裝的提供者並測試連線。 無需編寫一行程式碼。
使用 UDL 的步驟:建立一個文字檔案並將其重新命名為 測試.udl (確保你能看到擴充功能)。雙擊,轉到提供者選項卡,找到 微軟的Office 12.0 Access 資料庫引擎 OLE DB 提供者 或類似操作。在「連線」標籤中,選擇 .accdb/.mdb 文件,然後點選「測試連線」。如果測試成功, 你的問題不是驅動程式,而是連接字串或運行 PowerShell 的程序的體系結構/權限。
使用 PowerShell 和登錄驗證 OLE DB 提供者
對於 SQL Server,您可以使用下列命令來驗證 MSOLEDBSQL(版本 18/19)和 SQLNCLI 是否存在 命令 使用 PowerShell 檢查登錄檔 PowerShell 中的 Get-ItemProperty. 這些檢查對於混合環境很有用 Access 和 SQL Server 共存。
跑 以管理員身分使用 PowerShell 例如,使用這些針對 MSOLEDBSQL(SQL Server)的查詢:
Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" | \
Where-Object { $_.Name -like "*MSOLEDBSQL*" } | \
ForEach-Object { Get-ItemProperty $_.PSPath }
如果多個版本共存,您將看到輸出 安裝版本 適用於 18.x 和 19.x,包括 64 位元和 72 位元分支 Wow6432節點 (32 位元)。對於較舊的 SQLNCLI(SQL Server Native Client),您可以使用下列命令進行檢查:
Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" | \
Where-Object { $_.Name -like "*SQLNCLI*" } | \
ForEach-Object { Get-ItemProperty $_.PSPath }
對於 Access,要尋找的 ProgID 是 Microsoft.ACE.OLEDB.12.0 o Microsoft.ACE.OLEDB.16.0。您可以在 HKEY_CLASSES_ROOT (香港註冊處)。 ProgID 對應到 CLSID 和實際的供應商 DLL:
- HKCR\Microsoft.ACE.OLEDB.12.0\CLSID
- HKCR\CLSID\{CLSID}\InProcServer32
- 在 32 位元上 Windows x64:HKCR\Wow6432Node\CLSID\{CLSID}\InProcServer32
如果 ProgID 不存在或 InProcServer32 沒有指向有效的 DLL,則提供者安裝不正確。 重新安裝 Access 資料庫引擎 與您的體系結構相對應的,或者如果適用,請使用 regsvr32 手動註冊 DLL。
ProgID、CLSID 以及使用 Regsvr32 手動註冊
在 COM 中,ProgID 如下 Microsoft.ACE.OLEDB.12.0 指向一個 CLSID (GUID)。此 GUID 用於尋找 DLL 的位置 InProcServer32。如果該鍵不存在或路徑不正確,則無法從 PowerShell 載入提供者。在混合安裝中, 檢查 Wow6432Node 分支 對於 32 位元提供者。
若要手動註冊 COM DLL,請使用 Regsvr32您必須從提升的命令提示字元執行與 DLL (x86/x64) 相符的 regsvr32 版本。 OLE DB 提供者的通用範例如下:
regsvr32 "C:\\Ruta\\A\\ProveedorAce.dll"
對於 SQL Server 提供者(不是 Access),您也可以註冊 sqlncli11.dll,儘管今天明智的做法是遷移到 MSOLEDBSQL. 對非 Microsoft 供應商的支持 它只是驗證 ProgID→CLSID 以及 DLL 是否存在於註冊表中指定的位置。
在 PowerShell 中使用 System.Data.OleDb 連線到 Access
使用現代 PowerShell 最可靠的方法是使用 OLE DB .NET 提供程序,即 系統.數據.OleDb有了它,你可以創建一個 OleDb連接,一個 OleDb指令 如果你想將結果轉儲到記憶體中, OleDb資料適配器.
基本範例(開啟、諮詢和關閉) 使用 ACE 處理 .accdb:
$dbPath = "C:\\Datos\\MiBase.accdb"
$cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbPath;Persist Security Info=False;"
$cn = New-Object System.Data.OleDb.OleDbConnection $cs
$cmd = New-Object System.Data.OleDb.OleDbCommand
$cmd.Connection = $cn
$cmd.CommandText = "SELECT TOP 5 * FROM Clientes"
$adp = New-Object System.Data.OleDb.OleDbDataAdapter $cmd
$tbl = New-Object System.Data.DataTable
$cn.Open()
$adp.Fill($tbl)
$cn.Close()
$tbl | Format-Table -AutoSize
如果您只需要測試開啟/關閉,那麼您可以簡單地開啟和關閉連線。 如果失敗,則問題出在供應商或供應鏈。對於較舊的 .mdb 文件,您也可以嘗試:
$cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Datos\\Antigua.mdb;"
如果您的 Access 檔案有來自引擎本身的密碼,請新增屬性 Jet OLEDB:資料庫密碼 在字串中。請注意,這與伺服器憑證不同,因為 Access 是一個本機檔案: 存取控制在文件和提供者級別.
使用 UDL 檔案測試連接並提取連接字串
UDL 不僅用於列出提供者:它還允許您保存連接字串。使用記事本開啟 .udl 文件,您將看到一個包含以下內容的部分: 連接字符串 您可以將其複製到 PowerShell。
SQL Server(不是 Access)的 UDL 字串的典型範例如下:
提供者=MSOLEDBSQL.1;整合安全性=SSPI;資料來源=localhost;初始目錄=master; o 提供者=SQLNCLI11.1;使用者 ID=sa;資料來源=tcp:Server,1433;初始目錄=AdventureWorks;對於 Access,該模式是您在 ACE 中看到的模式: 提供者=Microsoft.ACE.OLEDB.12.0;資料來源=C:\\Path\\Base.accdb;
自動化腳本和憑證:零點擊
在任務規劃程式中安排無人參與的任務時,您不希望出現彈出對話方塊或憑證提示。在 Access 中,您通常 沒有像 SQL 中的伺服器 UID/PWD;是一個文件。但是,您可能需要網路憑證才能存取 UNC 路徑,或者如果字串包含密碼,則需要保護該字串。
良好的自動化實踐:
– 運行 腳本 使用服務帳戶 對 .accdb/.mdb 具有讀取/寫入權限。避免驅動器映射:使用 UNC 路線 \\伺服器\\資料夾\\Base.accdb。
如果您還將 ODBC 連線整合到其他引擎(例如 DB2),請不要以純文字輸入使用者/密碼。 您有幾種安全的選擇 在 PowerShell 中:
- 儲存 憑證管理器中的 PSCredential 並在運行時使用 Get-StoredCredential(類似 CredentialManager 的模組)讀取它。
- 使用 導出-Clixml 若要儲存與執行任務的使用者/主機綁定的 DPAPI 加密 PSCredential:
$cred = Get-Credential # pide una vez $cred | Export-Clixml -Path "C:\\Seguridad\\db2.cred" # En el script desatendido $cred = Import-Clixml "C:\\Seguridad\\db2.cred" - 如果您的引擎支持 綜合安全 (SQL Server,而不是 Access),使用它來避免連結密碼。
對於純訪問,重點關注文件權限和 避免彈出視窗. 不要在無人參與的任務中使用 WScript.Shell Popup:將結果記錄到 EventLog 或 寫入日誌 同 開始抄錄 或 Out-File。
OleDbDataAdapter:資料庫與資料集之間的橋樑
OleDb資料適配器 它是 ADO.NET 的關鍵部分,可作為資料來源(例如透過 ACE 存取)和記憶體結構之間的橋樑,例如 數據集 o 數據表。您可以使用 填 並堅持改變 更新狀態.
適配器要點:
– MissingSchemaAction=AddWithKey 使主鍵包含在載入的模式中。有助於 CommandBuilder 正確產生 INSERT/UPDATE/DELETE 語句。
典型的適配器建立方式 參數化指令 (ADO.NET 模型):
// C# (patrón general)
var da = new OleDbDataAdapter("SELECT * FROM Customers", cn);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.InsertCommand = new OleDbCommand("INSERT INTO Customers (CustomerID, CompanyName) VALUES (?, ?)", cn);
da.UpdateCommand = new OleDbCommand("UPDATE Customers SET CustomerID = ?, CompanyName = ? WHERE CustomerID = ?", cn);
da.DeleteCommand = new OleDbCommand("DELETE FROM Customers WHERE CustomerID = ?", cn);
// Parámetros (orden importa con OleDb)
在 .NET 中還有 OleDb命令產生器 從 SELECT 自動產生這些命令,當查詢直接針對表時,這大大簡化了 CRUD。 請注意,一些 OLE DB 提供者 不傳回主鍵元資料;在這種情況下,您需要手動將它們設定為 DataTable.PrimaryKey。
適配器方法包括: 填充(資料集/資料表), 填充模式, 更新狀態 以及從 DbDataAdapter 繼承的批次實用程式。它會觸發以下事件: 行更新 y 行更新,它允許您攔截每個 DML 操作。
ADO、ADO.NET、OLE DB 和 ODBC:清除名稱的叢林
微軟已多次更改名稱和策略,造成混亂。以下是一些指南: ODBC 是普遍的標準; OLEDB 它是 Windows COM 技術,為許多資料庫提供提供者; ADO (經典)依賴 OLE DB 並用於經典 VBA/ASP; ADO.NET 它是具有 System.Data.OleDb 或 Microsoft.Data.SqlClient 等提供者的現代 .NET 層。
對於 SQL Server,目前的 OLE DB 提供者是 MSOLEDBSQL (第三代,已棄用並維護)。對於 Access,提供者是 ACE的. 經典 SQLOLEDB (MDAC)和 SQLNCLI (SNAC)已經過時;如果你看到 提供者=SQLNCLI, 改成 提供者=MSOLEDBSQL 在現代 SQL Server 連線上。
在 .NET 中,建議的 SQL Server 提供者是 Microsoft.Data.SqlClient (NuGet 包)。舊版 系統.數據.SqlClient 它仍然存在但不再進化。 ADO.NET 並未過時:它是由下面的 Dapper 或 Entity Framework 等函式庫使用。
完整範例:DataSet 和 ListView 工作模式(WinForms 風格)
許多經典項目都遵循一個模式:使用 ACE 開啟連接,透過以下方式載入 DataSet OleDb資料適配器,操作記憶體中的行並透過更新反映變化。 這種方法在今天仍然有效且實用。 用於桌面。
VB.NET/WinForms 中的典型結構(總結):一個帶有共享變數(OleDbConnection、OleDbDataAdapter、DataSet)的模組,一個方法 連接 建立字串類型為「Provider=Microsoft.Jet.OLEDB.4.0; Data Source=…」或 ACE 的連接,填入 DataSet 並配置 MissingSchemaAction=AddWithKey,以及 命令產生器 自動產生 DML。
您可以在應用程式中複製的常見功能:
– 使用 GetOleDbSchemaTable 列出表 (OleDbSchemaGuid.Tables,約束「TABLE」)來填入 ComboBox。
此外,常見的還有:
– 使用 DataTable.Columns 中的欄位建構 ListView,將每個 DataRow 儲存到 ListViewItem.Tag,允許在 UI 中編輯,當按下 Save 時,將變更轉儲回 DataSet 並呼叫 dbDataAdapter.更新(dbDataSet,表名).
對於高點,建立一個 DataRow 新行,分配預設值 自動增量,將其新增至 Rows 並反映到 ListView 中。若要撤銷,請從 ListViewItem.Tag 擷取 DataRow 並執行 行.刪除. 所有這些都與 OleDb資料適配器.
PowerShell:從 ADO COM 到 ADO.NET
您可能會在 PowerShell 中找到較舊的範例 新物件-comobject ADODB.Connection y ADODB記錄集。它們有效,但實際上更建議使用 系統.數據.OleDb (ADO.NET),它更適合.NET 和 PowerShell 的現代資源管理。
Un .NET 極簡模式 相當於經典的 ADO 將是:
$dbFile = "C:\\Path\\to\\database.accdb"
$cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbFile;"
$cn = ::new($cs)
$cn.Open()
$cn.Close()
如果這給您帶來供應商錯誤,請檢查您的 ACE 安裝和架構。 執行 PowerShell x86 以使用 ACE x86 進行測試 當 32 位元 Office 與 x64 系統共存時,它通常是明確的線索。
細粒度診斷:位數、路徑和 UAC
導致生產中出現供應商錯誤或連線失敗的實際問題清單:
– 位數PowerShell x64 與 ACE x86(反之亦然)。執行相應的 shell 或安裝所需的版本。
更多值得關注的點:
– 檔案路徑:檢查路徑是否存在以及任務用戶 具有讀取/寫入權限 (如果有 UPDATE/INSERT)。避免在任務規劃程式中使用相對路徑:使用 絕對路徑或 UNC 路徑.
還請考慮:
– UAC/上下文:手動測試可能運行正常,但在調度程序中,它以其他帳戶運行,或沒有映射驅動器。請調整執行帳戶並使用 \server\resource。
別忘了:
– 持久安全資訊=False 在連接字串中 不要混合供應商 (不要嘗試對 Access 使用 MSOLEDBSQL 或對 SQL Server 使用 ACE。)
用於驗證的有用 PowerShell 程式碼片段
定位 註冊表中的 ACE (搜尋 ProgID 和 CLSID):
Get-ChildItem HKCR:\ | Where-Object { $_.Name -like "*ACE.OLEDB*" } | Select-Object -First 10 | ForEach-Object { Get-ItemProperty $_.PSPath }
檢查一下 MSOLEDBSQL (SQL Server)32/64 位,版本 18 和 19,以防您的環境混合使用兩個提供者(當您與 Access 和 SQL Server 共存時很有用):
Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" | \
Where-Object { $_.Name -like "*MSOLEDBSQL*" } | \
ForEach-Object { Get-ItemProperty $_.PSPath }
如果您需要手動註冊 DLL(這種情況很少見,但有可能出現),請記住: 對 x86 DLL 使用 32 位元 regsvr32 64 位元版本適用於 x64 DLL。運行提升的控制台。
從 A 到 Z:使用 DataAdapter 查詢和儲存範例
完整流程範例 OleDb資料適配器 在 PowerShell 中載入、修改和儲存資料到記憶體中(概念摘要):
$cs = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Datos\\MiBase.accdb;"
$cn = ::new($cs)
$cn.Open()
$select = "SELECT CustomerID, CompanyName FROM Customers"
$cmd = ::new($select, $cn)
$da = ::new($cmd)
$ds = New-Object System.Data.DataSet
$null = $da.Fill($ds, "Customers")
# Generador de comandos automático
$cb = New-Object System.Data.OleDb.OleDbCommandBuilder($da)
$da.MissingSchemaAction = ::AddWithKey
# Editar una fila en memoria
$row = $ds.Tables.Rows
$row = "Nombre Actualizado"
# Confirmar cambios en la base
$da.Update($ds, "Customers")
$cn.Close()
對於複雜的查詢,請考慮創建 插入命令/更新命令/刪除命令 手動並按順序使用參數,因為 OleDb 是基於 位置 (佔位符?)。 這避免了映射問題 與不歸還所有密鑰的提供者。
何時使用 ODBC、OLE DB 或 SqlClient
對於 PowerShell 中的 Access,最直接的方法是使用 ACE 的 OLE DB。對於 SQL Server,如果您使用 .NET,請使用 Microsoft.Data.SqlClient。如果您使用 C/C++ 程式設計或需要跨領域標準, ODBC 是您的盟友(適用於現代 SQL 的 SQL Server 第三代 Microsoft ODBC 驅動程式)。
如果您的遺留程式碼使用 SQLNCLI (Provider=SQLNCLI11)將其變更為 提供者=MSOLEDBSQL.如果你看到 SQLOLEDB (MDAC),盡快遷移: 是遺產 並且沒有利用安全性或性能改進。
在經典的 VBA/ASP 中,ADO+OLE DB 仍然有效;在 .NET 中,具有 OleDb 或 SQLClient 的 ADO.NET 是現代方法。 每一層都可以依賴前一層。 (ADO.NET 可以與 OLE DB 對話,OLE DB 可以使用 MSDASQL 與 ODBC 對話),這有助於相容性。
透過 PowerShell 或 .NET 使用 Access 需要調整體系結構、安裝正確的提供者並正確建立連接字串。做好這些準備後, 開啟、讀取和更新資料非常簡單,並且您可以根據需要擴展到 DataSet/Adapter 等模式或使用 DataReader 直接查詢。
在查看了典型的提供者錯誤、註冊表檢查、UDL 測試、ProgID/CLSID 結構和無提示自動化之後,您將獲得完整的映射,可以使用 PowerShell 中的 System.Data.OleDb 連接到 Access,並保證充分利用 OleDb資料適配器 並了解 ODBC、OLE DB、ADO 和 ADO.NET 如何融入 Microsoft 生態系統。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。