Skip to content

MS_ADONETDataProvider

nishi_74322014 edited this page Sep 11, 2026 · 4 revisions

ADO.NETデータプロバイダ

概要

以下、専用 API 型の ADO.NET データプロバイダの種類を列挙する。

補足(前提知識): ADO.NET データプロバイダは、
DbConnection / DbCommand / DbDataReader / DbDataAdapter 等の
抽象クラス(System.Data.Common)を実装した DBMS 別のライブラリである。
このため、抽象クラス経由で書けば DBMS 非依存のコードになるが、
実際には SQL 方言・型・パラメータ記法(@ / : / ?)が異なるため、
完全な非依存化には抽象化レイヤ(O/R マッパ等)が必要になる。

汎用 .NETデータ プロバイダ

  • API レイヤのみの提供。
  • 下位のドライバを選択できる。
  • 選択したドライバによって動きが変わる。
  • .NET 同梱のため、別途ランタイムのインストールが不要。

移行メモ(誤字): 元ページの「ラインタイム」は「ランタイム」の誤記。
以降も同様に読み替えている。

OLE DB

System.Data.OleDb

  • .NET 同梱のため、別途ランタイムのインストールが不要。
  • 下位の OLE DB ドライバを選択できる。

参考

ODBC

System.Data.Odbc

  • .NET 同梱のため、別途ランタイムのインストールが不要。
  • 下位の ODBC ドライバを選択できる。

参考

OLE DBとODBCの選択

サマリ

  • 結局、SQL Server 2014 でまだ廃止されていないようですが、
    Access などの他のマイクロソフト製品で OLE DB の
    サポート打ち切りは始まってきているようです。

  • ...と思ったら、2018 年に
    「OLE DB の非推奨が取り消し」となり、
    新バージョンがリリースされました。

補足(最新化:現在の整理): 経緯を時系列で整理すると以下になる。

時期 出来事
2011 SQL Server ネイティブ アクセスを ODBC に一本化する方針を表明(OLE DB 非推奨)
2018 方針を撤回し、Microsoft OLE DB Driver for SQL Server(MSOLEDBSQL)をリリース
現在 MSOLEDBSQL / MSODBCSQL の両系統が並行してメンテナンスされている

ただし、これは「ネイティブ(C/C++、SSIS、リンク サーバ等)のアクセス手段」の話であり、
.NET から SQL Server に接続する場合は Microsoft.Data.SqlClient が第一選択である。
System.Data.OleDb / System.Data.Odbc は、

  • 専用プロバイダが存在しない DBMS に接続する
  • 既存資産の移行で暫定的に使う

といった場合に限って使うのが妥当。
なお、旧 SQL Server Native Client(SQLNCLI / SQLNCLI11)は
非推奨であり、新規利用は不可。TLS 1.2 や UTF-8 照合順序などの
新機能に対応しないため、MSOLEDBSQL / MSODBCSQL 18 以降へ移行すること。

また、System.Data.OleDb は .NET Core 以降
Windows でのみ動作する(Linux / macOS では利用不可)点にも注意。

参考

DBMS固有 .NETデータ プロバイダ

SQL Server

System.Data.SqlClient

.NET 同梱のため、別途ランタイムのインストールが不要。

補足(最新化:Microsoft.Data.SqlClient へ):
System.Data.SqlClientメンテナンス モードであり、
新機能はすべて NuGet パッケージの
Microsoft.Data.SqlClient 側にのみ実装される。
具体的には以下が Microsoft.Data.SqlClient にしかない。

  • Always Encrypted with secure enclaves
  • Microsoft Entra ID(旧 Azure AD)認証
    Authentication=Active Directory Default など)
  • データ分類 / UTF-8 サポート
  • TDS 8.0(Encrypt=Strict

名前空間を System.Data.SqlClientMicrosoft.Data.SqlClient
置換するだけで移行できるケースが大半だが、
バージョン 4.0 以降は接続文字列の Encrypt の既定値が true に変更
されているため、自己署名証明書のままの検証環境では
TrustServerCertificate=True の指定、
または正しい証明書の配置が必要になる。

参考

Oracle

System.Data.OracleClient

  • .NET 同梱のため、別途ランタイムのインストールが不要。

  • 2C/S などでは、別途インストールの ODP.NET と比べ、メリットがあった。

  • ただし、.NET 4.0 から非推奨となっているので注意が必要。

    • System.Data.OracleClient が .NET 4.0 から
      非推奨になる (Oracle, ODP.NET, ADO.NET) - いろいろ備忘録日記
      http://devlights.hatenablog.com/entry/20090629/p1

    • マイクロソフト製 OracleClient が非推奨に
      http://www.infoq.com/jp/news/2009/06/oracleclient_deprecated

      マイクロソフトは、System.Data.OracleClient が .NET 4.0 以降は非推奨になると発表した。
      この名前空間に含まれるクラスは、.NET 4.0 では非推奨マークが付けられ、将来のバージョンでは削除される。

補足(最新化): 予告どおり、System.Data.OracleClient
.NET Core 以降には移植されていない(.NET Framework にのみ残存)。
現在 .NET から Oracle に接続する場合は、
Oracle 社提供の Oracle.ManagedDataAccess(.NET Framework 向け)/
Oracle.ManagedDataAccess.Core(.NET 以降向け)を使用する。

ODP.NETデータ プロバイダ

ODP.NET Managed Driver

最近マネージドの Oracle クライアント不要の ODP.NET がリリースされた(Instant Client よりさらに楽)。
ODP.NET Managed Driver は Oracle 12c になって登場したフルマネージドの ODP.NET ドライバ。
ODAC 12c は Oracle 12c で追加されたコンポーネントだが、Oracle 10g までサポートしている。

補足(最新化:現在の ODP.NET): 現在の主要な選択肢は以下。

名称 NuGet パッケージ 対象
ODP.NET Core Oracle.ManagedDataAccess.Core .NET Core 3.1 / .NET 6 以降(クロスプラットフォーム)
ODP.NET Managed Oracle.ManagedDataAccess .NET Framework 4.6.2 以降
ODP.NET Unmanaged (ODAC に同梱) .NET Framework のみ。Oracle Client が必要

上表の「.NET Framework 4.5.2 まで」という記述は当時の ODAC 12c の話であり、
現行版はより新しいランタイムに対応している。
新規開発では、32/64bit や Oracle Client のバージョン不一致問題が起きない
マネージド ドライバ(Oracle.ManagedDataAccess.Core)を選ぶのが定石。

参考

PostgreSQL

Npgsql ADO.NET Data Provider for PostgreSQL

PostgreSQL で主流の .NET データ・プロバイダ

dotConnect for PostgreSQL

一応、Npgsql 以外の選択肢(実績は聞いたこと無し)。

参考

補足(ライセンス): Npgsql は PostgreSQL ライセンス(BSD 相当)であり、
後述の MySQL Connector/NET と異なり商用製品への組み込みに
ライセンス上の制約はない。

MySQL

MySQL Connector/NET

  • ライセンスに注意が必要(GPL)。

    • DB サーバのライセンスを整理する - うめつる開発室
      http://blog.ume108.mobi/?p=5649

      • MySQL のライセンスってどうなってるの

        では、Oracle の .NET ライブラリ Connector/Net はどうでしょうか?微妙です。
        開発する本体プログラムの一部として密接に関係付けられた状態でリンクされるわけですから。
        開発したソフトウェアを GPL にして公開するのなら問題はないけれど、
        そうでない製品を作るのなら Connector/Net を使わないで作るか、
        さもなくば MySQL の商用ライセンスを買うか、MySQL を諦めるかということになります。

    • GPL では頒布に問題があるようです。

      • 受託開発や SaaS では問題無さそうです。
      • パッケージ的な頒布は問題になりそうです。
      • GPL については「GPLライセンス」を参照。

補足(最新化:ライセンス回避の選択肢): MySQL Connector/NET は
GPLv2 + FOSS ライセンス例外で提供されている。
例外条項により、一定の OSS ライセンスで公開するアプリケーションであれば
GPL 汚染を回避できるが、クローズドな製品として頒布する場合は
商用ライセンスが必要になる点は元ページの記述どおり。

現在は、これを避けるための実質的な選択肢として、
MariaDB 財団などが開発する MySqlConnector
(NuGet: MySqlConnector、MIT ライセンス)が広く使われている。
非同期 I/O の実装品質でも評価が高く、
Pomelo.EntityFrameworkCore.MySql もこれを基盤としている。

参考

MySQL + Connector/NET

DB2

IBM Data Server Provider for .NET

純正、DB2 .NET データ プロバイダ

補足(最新化): 現在は NuGet パッケージ
IBM.Data.Db2(.NET 向け)/ IBM.Data.DB2.Core として提供されている。

dotConnect for DB2

dotConnect 系(実績は聞いたこと無し)

HiRDB

pddndp20.dll

純正

  • 配列バインドをサポート
  • 型指定、サイズ指定が必須

参考、3rd

情報なし。

その他

GPLライセンス

OSS のライセンスに移動しました。

コネクション・プーリング

概要

コネクション・プーリング(接続プール)は、

補足(プールが効く単位): 接続プールは
接続文字列が完全に一致する単位で作られる。
このため、以下のような実装ではプールが分断され、逆に性能が劣化する。

  • ユーザ毎に異なる ID / パスワードで接続する(ベース クライアント方式)
  • Application Name などを動的に組み立てる

逆に、SqlConnection
using で確実に Dispose(=プールへ返却)することが重要で、
返却漏れは Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool.
というエラーとして顕在化する(既定のプール上限は 100)。

参考

参考

.NET Coreのデータプロバイダ

「.NET 同梱」と書いてあるモノも、
.NET Coreに関しては、NuGet から取得する。

ADO.NET以外のデータプロバイダ

昔のVB6、VBA、VBScriptなどからデータアクセスする際に使用するデータプロバイダ
ADO.NET以外のデータプロバイダ

CX's Hello, World!

構築


Tags: 移行, データアクセス, ADO.NET

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally