總結
本文將說明如何檢查 Windows 電腦上安裝了哪個 SQL Server 的物件連結與嵌入資料庫(OLE DB)驅動程式或提供者,如何驗證其運作,以及如何追蹤其在 Windows 登錄檔中的註冊。 當應用程式無法連接 SQL Server,且懷疑 OLE DB 驅動程式遺失或未註冊時,請使用這些檢查。
透過PowerShell驗證 OLE DB 驅動程式或提供者
要查詢作業系統上安裝了哪些版本的 SQL Server OLE DB 驅動程式,請以管理員身份執行以下 PowerShell 指令碼。
Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" |
Where-Object { $_.Name -like "*MSOLEDBSQL*" } |
ForEach-Object { Get-ItemProperty $_.PSPath }
如果你的作業系統安裝了 18 和 19 版本,輸出可能會是這樣。
InstalledVersion : 18.7.4.0
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSOLEDBSQL
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
PSChildName : MSOLEDBSQL
PSProvider : Microsoft.PowerShell.Core\Registry
InstalledVersion : 19.4.1.0
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSOLEDBSQL19
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
PSChildName : MSOLEDBSQL19
PSProvider : Microsoft.PowerShell.Core\Registry
InstalledVersion : 18.7.4.0
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSOLEDBSQL
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft
PSChildName : MSOLEDBSQL
PSProvider : Microsoft.PowerShell.Core\Registry
InstalledVersion : 19.4.1.0
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSOLEDBSQL19
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft
PSChildName : MSOLEDBSQL19
PSProvider : Microsoft.PowerShell.Core\Registry
這個 InstalledVersion 數值顯示每個已安裝驅動程式的精確編譯版本。 Microsoft OLE DB Driver 19 for SQL Server (MSOLEDBSQL19) 會與 Microsoft OLE DB Driver 18 for SQL Server (MSOLEDBSQL) 並排安裝,因此看到兩個鍵是預期中的。 要確認你是否使用最新版本,請將數值與下載 Microsoft OLE DB Driver for SQL Server 上列出的目前一般可用(GA)版本做比較。
檢查是否有安裝 SQL Server Native Client(SQLNCLI)
若要檢查 OLE DB 提供者介面 (SQLNCLI) 安裝,請以系統管理員身分執行下列 PowerShell Cmdlet。
Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft", "HKLM:\SOFTWARE\Wow6432Node\Microsoft" |
Where-Object { $_.Name -like "*SQLNCLi*" } |
ForEach-Object { Get-ItemProperty $_.PSPath}
注意
SQL Server 原生客戶端(SNAC,SQLNCLI或 SQLNCLI11)以及舊有的 Microsoft OLE DB Provider for SQL ServerSQLOLEDB () 並未隨 SQL Server 2022(16.x)及更新版本,或 SQL Server Management Studio 19 及以後版本一同出貨。 它們不建議用於新應用程式開發。 還是用Microsoft OLE DB Driver for SQL Server吧。 本文在範例中仍使用 SQLNCLI,因為它在您進行疑難排解的現有系統中仍很常見。
透過 UDL 檔案驗證 OLE DB 驅動程式
測試 OLE DB 驅動程式最簡單的方法之一是使用通用資料連結(UDL)檔案。 UDL 檔案會開啟 資料連結屬性 對話框,列出已註冊在電腦上的 OLE DB 提供者,讓你能在不使用完整應用程式的情況下測試連線。
要建立並開啟 UDL 檔案,請依照以下步驟操作:
- 請確保你在檔案總管中 開啟了副檔名 ,這樣才能更改副檔名。
- 在檔案總管中建立任意文字檔,然後將其命名為 .udl 檔名。 當 Windows 警告你更改副檔名時,選擇「是」。
- 雙擊該檔案可開啟 資料連結屬性 對話框,您可以查看已安裝的供應商並測試其連線。
- 選取對話框中的 [確定 ] 以確認組態。
Tip
如果按兩下該檔案後沒有開啟 資料連結屬性 對話方塊(例如,檔案在文字編輯器中開啟,或傳回錯誤),請嘗試以下任一替代方法:
右鍵點選 .udl 檔案,然後選擇 屬性。 在大多數系統中,此動作也會開啟 資料連結屬性 對話框。
直接開啟對話框時,執行以下指令,其中 C:\temp\test.udl 是你的檔案路徑:
Rundll32.exe "C:\Program Files\Common Files\System\OLE DB\oledb32.dll",OpenDSLFile C:\temp\test.udl
要在 64 位元作業系統上開啟 32 位元對話框,請參見 「啟動 UDL 檔案」。
關於如何透過每個提供者測試連線的逐步指引,請參見「使用 UDL 檔案測試 OLE DB 連接 SQL Server」。
檢查 UDL 檔案內容,以取得連線字串
如果您在文字編輯器中開啟 UDL 檔案,則可以複製連接字串以在應用程式中使用。 以下提供兩個範例:
Provider=MSOLEDBSQL.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=master;Data Source=localhost;Initial File Name="";Server SPN="";Authentication="";Access Token=""
Provider=SQLNCLI11.1;Integrated Security="";Persist Security Info=False;User ID=sa;Initial Catalog=AdventureWorks;Data Source=tcp:SQLProd01.contoso.com,1433;Initial File Name="";Server SPN=""
在 Windows 登錄檔中追蹤 OLE DB 提供者
要驗證驅動程式,首先檢查該名稱是否出現在 64 位元或 32 位元的 UDL 對話框中已安裝的提供者清單中,如前一節所示。 如果沒有,請重新安裝服務提供商或聯絡供應商。
如果提供者有列出但連線仍然失敗,可以在登錄檔追蹤驅動程式的位置。 驅動程式名稱為 COM ProgID。 你可以在 HKEY_CLASSES_ROOT找到它。
將 ProgID 映射到提供者名稱
以 SQL Server Native Client 驅動程式為例,下圖顯示 ProgID SQLNCLI11.1 與提供者名稱 SQL Server Native Client 11.0 之間的對應關係。
32 位和 64 位提供者的 ProgID 都會出現在相同的密鑰下。
除了 SQLNCLI11.1 之外,還有一個名為 SQLNCLI11 的 ProgID。 這是因為供應商開發人員可能允許同一提供者的多個版本並排安裝,而且每個版本各自帶有不同的數字尾碼。 未編號的名稱是與版本無關的 ProgID。 應用程式可指向此處,並重新導向到該提供者的最新版本。
實際上,這兩個不同的 ProgID 名稱應視為等同。 不過,也可能有情況並非如此。 在這些情況下,使用版本獨立名稱的應用程式無法連線,但如果使用已設定版本的 ProgID,則可以連線。 原因是這兩個項目指向不同的 CLSID 值,而這就是用來尋找提供者 DLL 的方式。
從 CLSID 找到提供者 DLL
CLSID 就是 COM GUID。 COM 基礎結構會從 ProgID 找出 GUID。 然後,它會在 HKEY_CLASSES_ROOT\CLSID 金鑰下尋找 GUID 與金鑰名稱相符的金鑰:
值 InProcServer32 會指向提供者 DLL。
若為 32 位元提供者,COM 會使用相同的 GUID,但會在 HKEY_CLASSES_ROOT\Wow6432Node\CLSID 底下尋找它。
在此情況下,提供者位於 SysWow64 資料夾中。
注意
這些範例來自64位機器。 在 32 位元電腦上,登錄中沒有 Wow6432Node。
檢查 SQL Server Native Client 11.0 的登錄路徑
這些登錄機碼是在 64 位元電腦的登錄編輯程式中指向 SQL Server Native Client 11.0 的路徑:
HKEY_CLASSES_ROOT\SQLNCLI11.1\CLSIDHKEY_CLASSES_ROOT\CLSID\<guid>\InProcServer32HKEY_CLASSES_ROOT\Wow6432Node\CLSID\<guid>\InProcServer32
這些是32位機器之註冊表編輯器中的路徑:
HKEY_CLASSES_ROOT\SQLNCLI11.1\CLSIDHKEY_CLASSES_ROOT\CLSID\{guid}\InProcServer32
支援非 Microsoft 的 OLE DB 提供者
非 Microsoft OLE DB 提供者的技術支援僅限於驗證 ProgID 是否指向有效的 CLSID,以及子金鑰指向InProcServer32正確的 DLL。 如果路徑不正確或登錄項目不存在,請重新安裝提供者或聯絡廠商。
使用 regsvr32 手動註冊提供者 DLL
如果檔案存在但登錄檔沒有,你可以用 REGSVR32手動註冊提供者。 若要註冊 COM DLL,請在提高權限的命令提示字元中執行下列命令:
Regsvr32 sqlncli11
如果提供者同時有 32 位和 64 位版本,請針對這兩個 DLL 執行 命令。 使用 32 位命令提示字元來註冊 32 位 DLL。