在 Microsoft .NET 中使用 .NET 提供者時,請務必瞭解各種元件及其相依性,以便順暢地整合到您的應用程式。 本文概述 .NET 提供者的基本層面、其預設搜尋路徑,以及疑難解答指導方針。
注意
本文未涵蓋 .NET Core 安裝。
Microsoft .NET 數據提供者
Microsoft .NET 包含隨附於 .NET Framework 的四個數據提供者:
- System.Data.SqlClient
- System.Data.Odbc
- System.Data.OleDb
- System.Data.OracleClient
前三個包含在System.Data.DLL中,最後一個包含在System.Data.OracleClient.DLL中。 建置應用程式時,您只需要將適當的 DLL 參考新增至您的專案,然後使用提供者。
System.Data.SqlClient 包含類似 SQL Native Client 的實作程式代碼,完全不依賴 OLE DB 或 ODBC API。
System.Data.Odbc 和 System.Data.OleDb 不提供任何固有的資料庫功能。 相反地,它們會分別載入 ODBC 驅動程式和 OLE DB 提供者。
System.Data.OracleClient 也包含實作程式代碼,但與 Oracle ODBC 驅動程式和 OLE DB 提供者一樣,它也依賴要安裝的 Oracle 用戶端軟體或 Oracle 數據存取元件 (ODAC) 軟體。
注意
一般而言,建議您使用 Oracle 提供的驅動程式,而不是Microsoft實作,因為先前的驅動程式可能更最新。 如果從Microsoft驅動程序實作切換到 Oracle 提供者,即可解決問題,這是慣用的解決方案。
預設 .NET 搜尋路徑
不同於載入 ODBC 驅動程式和 OLE DB 提供者,.NET 資料提供者不會依賴登錄。 相反地,.NET 載入器會使用搜尋啟發學習法,如下所示:
- 已
DEVPATH
檢查共用資料夾的環境變數。 只有在開發共用元件時,才應該使用此專案。 開發完成後,元件應該安裝在全域程式集緩存 (GAC) 中。 - 檢查 GAC 以查看元件是否在應用程式之間共用。 如果元件不在 GAC 中,則為私用元件。
- 如果應用程式或 Web 組態檔有專案,
href
則 屬性會提供包含元件指令清單之檔案的名稱和絕對路徑。 - 檢查安裝應用程式的資料夾。
- 會檢查與包含元件指令清單之檔案同名之應用程式資料夾中的子資料夾。
- 如果組態檔有專案,
privatePath
則屬性會提供一或多個子資料夾的名稱,以在應用程式資料夾下搜尋。
搜尋啟發學習法是一般 DLL 載入演算法。 使用內建 .NET 提供者時,DLL 幾乎一律位於下列其中一個資料夾中:
- C:\windows\microsoft.net\Framework (32 位元件)
- C:\windows\microsoft.net\Framework64 (64 位元件)
在這些資料夾下,將會有各種 .NET 版本的資料夾。 一般而言,我們只關心:
- v2.0.50727 (.NET 2.0, 3.0, 3.5)
- v4.0.30319 (.NET 4.x)
您可能會注意到 .NET 1.0 和 1.1 資料夾。 這些不支援,且不包含任何元件。 您也可以注意到 .NET 3.0 和 3.5 資料夾。 雖然這些檔案可能包含這些 .NET 版本特定的特定檔案,但它們都是 2.0 版的擴展名,而且 System.Data.DLL 位於 2.0 資料夾中,因為它不是擴展名 DLL。 先前提到的資料夾是內建架構 DLL 的位置。
此外,這些 DLL 和第三方 DLL 會出現在 GAC 中,也就是搜尋演算法的外觀。 GAC 位於:
- C:\windows\assembly (適用於 .NET Framework 2.0、3.0、3.1、4.x)。
部分 .NET 4.0 元件也位於:
- C:\windows\microsoft.net\assembly。
如需更完整的指導方針,請參閱 運行時間如何找出元件。 使用 PROCMON 也可能顯示搜尋路徑。
協力廠商提供者
許多已安裝Microsoft提供者,例如 Analysis Services 未隨附於 .NET Framework。 此外,還有第三方 .NET 提供者,例如獨立安裝的 Oracle ODP 提供者。
針對第三方提供者,請確定元件位於下列其中一個資料夾中,且其為64位或32位,視應用程式而定:
- C:\windows\microsoft.net\assembly (適用於 .NET Framework 4.x 版本)
- C:\windows\assembly (適用於 .NET Framework 2.0、3.0、3.1、4.x)
下表顯示一些常見提供者的 DLL 和元件名稱:
易記名稱 | 組件名稱 | DLL |
---|---|---|
.NET Data Provider for SQL Server | System.Data.SqlClient | System.Data.DLL |
OLE DB 提供者 | System.Data.OleDb | System.Data.DLL |
ODBC 提供者 | System.Data.Odbc | System.Data.DLL |
Analysis Services 提供者 | Analysis Services 提供者 | Microsoft.AnalysisServices.AdomdClientMicrosoft.AnalysisServices.AdomdClient.DLL |
SQL CE 提供者 | System.Data.SqlServerCe | System.Data.SqlServerCe.DLL |
Microsoft的 Oracle 提供者 | System.Data.OracleClient | System.Data.OracleClient.DLL |
Oracle 的 ODP 提供者 | Oracle.DataAccess.Client | Oracle.DataAccess.DLL |
針對 .NET 提供者進行疑難解答時,沒有內建或一般化工具,例如 ODBC 系統管理員或 UDL 檔案,可獨立測試應用程式。 在這種情況下,您可以使用您選擇的語言撰寫快速測試應用程式。 以下是以 PowerShell 撰寫的範例應用程式:
#-------------------------------
#
# get-SqlAuthScheme.ps1
#
# PowerShell script to test a System.Data.SqlClient database connection
#
# USAGE: .\get-SqlAuthScheme tcp:SQLProd01.contoso.com,1433 ' explicitly specify DNS suffix, protocol, and port # ('tcp' must be lower case)
# USAGE: .\get-SqlAuthScheme SQLProd01 ' let the driver figure out the DNS suffix, protocol, and port #
#
#-------------------------------
param ([string]$server = "localhost")
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
$connstr = "Server=$server;Database=master;Integrated Security=SSPI"
[System.Data.SqlClient.SqlConnection] $conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = $connstr
[System.DateTime] $start = Get-Date
$conn.Open()
[System.Data.SqlClient.SqlCommand] $cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.CommandText = "select auth_scheme from sys.dm_exec_connections where session_id=@@spid"
$cmd.Connection = $conn
$dr = $cmd.ExecuteReader()
$result = $dr.Read()
$auth_scheme = $dr.GetString(0)
$conn.Close()
$conn.Dispose()
[System.DateTime] $end = Get-Date
[System.Timespan] $span = ($end - $start)
"End time: " + $end.ToString("M/d/yyyy HH:mm:ss.fff")
"Elapsed time was " + $span.Milliseconds + " ms."
"Auth scheme for " + $server + ": " + $auth_scheme
如果您的文稿位於 , C:\temp
而且您想要擷取名為 sqlprod01
的伺服器驗證配置,請以系統管理員身分從 Windows PowerShell 執行下列命令:
.\get-sqlauthscheme.ps1 sqlprod01
一般而言,如果元件/DLL 存在,載入 .NET 提供者將不會是問題。 最常見的問題是驗證問題,您可以 透過UDL檔案使用對等的 OLE DB 提供者進行測試。
如需不熟悉驅動程式之 連接字串的說明,請參閱連接字串參考。