MS_ADONETDataProvider - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- 戻る(ADO.NET、データプロバイダ)
- ADO.NETデータプロバイダ
- ADO.NET以外のデータプロバイダ
以下、専用 API 型の ADO.NET データプロバイダの種類を列挙する。
補足(前提知識): ADO.NET データプロバイダは、
DbConnection/DbCommand/DbDataReader/DbDataAdapter等の
抽象クラス(System.Data.Common)を実装した DBMS 別のライブラリである。
このため、抽象クラス経由で書けば DBMS 非依存のコードになるが、
実際には SQL 方言・型・パラメータ記法(@/:/?)が異なるため、
完全な非依存化には抽象化レイヤ(O/R マッパ等)が必要になる。
- API レイヤのみの提供。
- 下位のドライバを選択できる。
- 選択したドライバによって動きが変わる。
- .NET 同梱のため、別途ランタイムのインストールが不要。
移行メモ(誤字): 元ページの「ラインタイム」は「ランタイム」の誤記。
以降も同様に読み替えている。
- .NET 同梱のため、別途ランタイムのインストールが不要。
- 下位の OLE DB ドライバを選択できる。
- .NET 同梱のため、別途ランタイムのインストールが不要。
- 下位の ODBC ドライバを選択できる。
- ODBC の概要
https://learn.microsoft.com/ja-jp/sql/odbc/reference/odbc-overview - ODBC の基礎
https://learn.microsoft.com/ja-jp/dotnet/framework/data/adonet/odbc-data-provider
-
結局、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 では利用不可)点にも注意。
- Microsoft SQLNCli team blog
- Microsoft is Aligning with ODBC for Native Relational Data Access
https://learn.microsoft.com/en-us/archive/blogs/sqlnativeclient/microsoft-is-aligning-with-odbc-for-native-relational-data-access - Announcing the new release of OLE DB Driver for SQL Server
https://learn.microsoft.com/en-us/archive/blogs/sqlnativeclient/announcing-the-new-release-of-ole-db-driver-for-sql-server
- Microsoft is Aligning with ODBC for Native Relational Data Access
.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.SqlClient→Microsoft.Data.SqlClientに
置換するだけで移行できるケースが大半だが、
バージョン 4.0 以降は接続文字列のEncryptの既定値がtrueに変更
されているため、自己署名証明書のままの検証環境では
TrustServerCertificate=Trueの指定、
または正しい証明書の配置が必要になる。
- Microsoft.Data.SqlClient 名前空間 | Microsoft Learn
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.data.sqlclient - System.Data.SqlClient 名前空間 | Microsoft Learn
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient
-
.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 以降向け)を使用する。
-
配列バインドをサポート
-
フェッチ・サイズをサポート
-
Oracle Instant Client 対応
- Oracle Instant Client
https://www.oracle.com/jp/database/technologies/instant-client.html- Instant Client Downloads
https://www.oracle.com/database/technologies/instant-client/downloads.html
- Instant Client Downloads
- Oracle Instant Client
最近マネージドの Oracle クライアント不要の ODP.NET がリリースされた(Instant Client よりさらに楽)。
ODP.NET Managed Driver は Oracle 12c になって登場したフルマネージドの ODP.NET ドライバ。
ODAC 12c は Oracle 12c で追加されたコンポーネントだが、Oracle 10g までサポートしている。
-
素敵なおひげですね
-
Oracle Client(ODP.NET) を手っ取り早くインストールする方法について
http://stknohg.hatenablog.jp/entry/2014/10/24/074303 -
ODP.NET Managed Driver(管理対象ドライバ) についての私的まとめ
http://stknohg.hatenablog.jp/entry/2014/11/02/173039
-
-
ODAC 12c Release 3 Installation Instructions
https://www.oracle.com/database/technologies/dotnet-odacdeploy-downloads.html-
ODP.NET, Managed Driver requires .NET Framework 4 or later up to .NET Framework 4.5.2
-
ODP.NET, Unmanaged Driver requires .NET Framework 3.5 SP 1 or later up to .NET Framework 4.5.2
-
-
古い ODP.NET は、
-
Oracle クライアントとのバージョン不一致や 32/64bit 不一致
などで動かないなどのトラブルがよく起きるためサポートが面倒。 - なるべく早く、ODP.NET, Managed Driver に乗り換えたほうが良い。
-
Oracle クライアントとのバージョン不一致や 32/64bit 不一致
補足(最新化:現在の 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)を選ぶのが定石。
-
Oracle の ODP.NET のフェッチサイズと配列バインド
が強力だという話。 - OSS コンソーシアム
https://www.osscons.jp/jo1pgfhtx-537/#_537
PostgreSQL で主流の .NET データ・プロバイダ
一応、Npgsql 以外の選択肢(実績は聞いたこと無し)。
-
Npgsql
-
Npgsql
https://www.npgsql.org/ -
PostgreSQL のための Npgsql .Net データプロバイダ : プロジェクトホームページ
http://www.postgresql.jp/document/NPGSQL/index.html -
.NET ライブラリ「Npgsql」による PostgreSQL の活用 - Build Insider
http://www.buildinsider.net/small/npgsql/01
-
dotConnect
- dotConnect for PostgreSQL
ADO.NET Provider for PostgreSQL with Entity Framework
LINQ to PostgreSQL and NHibernate Support
https://www.devart.com/dotconnect/postgresql/
- dotConnect for PostgreSQL
補足(ライセンス): Npgsql は PostgreSQL ライセンス(BSD 相当)であり、
後述の 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もこれを基盤としている。
純正、DB2 .NET データ プロバイダ
補足(最新化): 現在は NuGet パッケージ
IBM.Data.Db2(.NET 向け)/IBM.Data.DB2.Coreとして提供されている。
dotConnect 系(実績は聞いたこと無し)
純正
- 配列バインドをサポート
- 型指定、サイズ指定が必須
情報なし。
OSS のライセンスに移動しました。
コネクション・プーリング(接続プール)は、
- 接続を再利用することで性能向上を図る仕組み。
- この機能は、ADO.NET データプロバイダが提供する。
- 通常、既定で有効になっている。接続文字列などで config する。
- ベース クライアント セキュリティ モデルでは利用不可。
補足(プールが効く単位): 接続プールは
接続文字列が完全に一致する単位で作られる。
このため、以下のような実装ではプールが分断され、逆に性能が劣化する。
- ユーザ毎に異なる ID / パスワードで接続する(ベース クライアント方式)
Application Nameなどを動的に組み立てる逆に、
SqlConnectionは
usingで確実にDispose(=プールへ返却)することが重要で、
返却漏れはTimeout expired. The timeout period elapsed prior to obtaining a connection from the pool.
というエラーとして顕在化する(既定のプール上限は 100)。
-
接続プール
https://learn.microsoft.com/ja-jp/dotnet/framework/data/adonet/sql-server-connection-pooling -
ADO.NET 入門記 -004 - いろいろ備忘録日記
(コネクションプーリングをする場合としない場合の速度差)
http://devlights.hatenablog.com/entry/20070812/p4 -
門外不出の Oracle 現場ワザ 第 5 章
DB アクセスの空白地帯 コネクションプーリングを極める
http://www.oracle.com/technetwork/jp/articles/chapter5-2-085301-ja.html
「.NET 同梱」と書いてあるモノも、
.NET Coreに関しては、NuGet から取得する。
昔のVB6、VBA、VBScriptなどからデータアクセスする際に使用するデータプロバイダ
(ADO.NET以外のデータプロバイダ)
Tags: 移行, データアクセス, ADO.NET