在 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(也称为“assembly”)的引用,然后就可以使用该提供程序。
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 |
---|---|---|
SQL Server 的 .NET 数据访问接口 | 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 提供程序进行测试。
有关不熟悉驱动程序连接字符串的帮助,请参阅连接字符串参考。