次の方法で共有


.NET データ プロバイダーのインストール チェック

Microsoft .NET で .NET プロバイダーを使用する場合は、アプリケーションへのシームレスな統合のために、さまざまなコンポーネントとその依存関係を理解することが重要です。 この記事では、.NET プロバイダーの重要な側面、既定の検索パス、およびトラブルシューティング ガイドラインについて説明します。

Note

この記事では、.NET Core のインストールについては説明しません。

Microsoft .NET データ プロバイダー

Microsoft .NET には、.NET Framework に付属する 4 つのデータ プロバイダーが含まれています。

  • System.Data.SqlClient
  • System.Data.Odbc
  • System.Data.OleDb
  • System.Data.OracleClient

最初の 3 つは System.Data.DLL に含まれており、最後の 3 つは 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 Data Access Components (ODAC) ソフトウェアにも依存します。

Note

一般に、以前のドライバーは最新の状態になる可能性があるため、Microsoft の実装ではなく、Oracle が提供するドライバーを使用することをお勧めします。 Microsoft ドライバーの実装から Oracle プロバイダーに切り替えることで問題を解決できる場合は、推奨されるソリューションです。

既定の .NET 検索パス

ODBC ドライバーや OLE DB プロバイダーの読み込みとは異なり、.NET データ プロバイダーはレジストリに依存しません。 代わりに、.NET ローダーは、次のように説明されている検索ヒューリスティックを使用します。

  1. DEVPATH環境変数が共有フォルダーに対してチェックされます。 これは、共有アセンブリを開発する場合にのみ使用してください。 開発が完了したら、アセンブリを Global Assembly Cache (GAC)にインストールする必要があります。
  2. GAC は、アセンブリがアプリケーション間で共有されているかどうかを確認するためにチェックされます。 アセンブリが GAC 内にない場合は、プライベート アセンブリです。
  3. アプリケーションまたは Web 構成ファイルに項目がある場合、 href 属性はアセンブリのマニフェストを含むファイルの名前と絶対パスを指定します。
  4. アプリケーションがインストールされているフォルダーがチェックされます。
  5. アセンブリのマニフェストを含むファイルと同じ名前のアプリケーション フォルダー内のサブフォルダーがチェックされます。
  6. 構成ファイルに項目がある場合、 privatePath 属性は、アプリケーション フォルダーの下で検索する 1 つ以上のサブフォルダーの名前を指定します。

検索ヒューリスティックは、一般的な 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 は拡張 DLL ではないため、2.0 フォルダーにあります。 前述のフォルダーは、組み込みのフレームワーク 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 を使用すると、検索パスが表示される場合もあります。

サード パーティ プロバイダー

Analysis Services などの Microsoft がインストールするプロバイダーの多くは、.NET Framework には付属していません。 さらに、Oracle の ODP プロバイダーなど、独立してインストールされるサードパーティの .NET プロバイダーもあります。

サードパーティ プロバイダーの場合は、アセンブリが次のいずれかのフォルダーにあり、アプリケーションに応じて 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 Administrator や 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 プロバイダーを使用してテスト

使い慣れないドライバーの接続文字列については、「接続文字列リファレンスを参照してください。

詳細