-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ADONET
- 戻る(データアクセスのいろいろ)
- ADO.NET
- データプロバイダ / ADO.NETデータプロバイダ
.NET で高速かつ汎用的に DB アクセスを行う
UDA(Microsoft Universal Data Access)を実現する
ADO の後継となる .NET 用データプロバイダ(標準オブジェクト モデル)。
この標準オブジェクト モデルには、DB から読み出したデータを格納する
データセット、データテーブル等のクラスが提供されており、柔軟な利用が可能である。
-
Microsoft Universal Data Access の概要
https://learn.microsoft.com/ja-jp/previous-versions/windows/desktop/ms713633(v=vs.85) -
ADO.NET | Microsoft Learn
https://learn.microsoft.com/ja-jp/dotnet/framework/data/adonet/ -
ADO.NET - Wikipedia
https://ja.wikipedia.org/wiki/ADO.NET
非接続型のデータアクセスを推奨している。
- ADO 時代の非接続型データアクセス
とあるコンサルタントのつぶやき - Site Home - MSDN Blogs
https://learn.microsoft.com/en-us/archive/blogs/nakama/ado
補足(用語の整理): 「非接続型(disconnected)」とは、
接続を保持したまま処理しないという意味であり、
DB に接続せずに動くという意味ではない。
型 代表クラス 特徴 接続型 DbDataReader(SqlDataReader等)前方専用・読み取り専用のストリーム。接続を保持したまま 1 行ずつ読む。最も高速でメモリ効率が良い 非接続型 DataSet/DataTable+DbDataAdapter一括で読み込み、接続を切ってからメモリ上で操作。更新は Updateでまとめて反映非接続型が推奨されたのは、Web アプリのように
接続を長く握るとスケールしない構成が主流になったためである。
補足(最新化:現在の実装スタイル): 現在の .NET では、
DataSet/DataTableは新規実装ではほぼ使われない
(型付き DataSet も同様。POCO クラスへマッピングするのが標準)- 代わりに、
DbDataReaderから POCO へ詰め替えるか、
ORM(EF Core / Dapper)を使う- I/O はすべて非同期 API(
OpenAsync/ExecuteReaderAsync/
ReadAsync)を用いる。ASP.NET Core ではスレッド枯渇を避けるため必須級- 接続は
using(await using)で確実に破棄し、
接続プール(ADO.NETデータプロバイダ)に返却するawait using var cn = new SqlConnection(connectionString); await cn.OpenAsync(); await using var cmd = new SqlCommand( "SELECT Id, Name FROM Users WHERE Id = @id", cn); cmd.Parameters.Add("@id", SqlDbType.Int).Value = id; await using var r = await cmd.ExecuteReaderAsync(); while (await r.ReadAsync()) { // ... }なお、SQL は必ずパラメータ化すること。
文字列連結で組み立てると SQL インジェクションになる。
OLE DB や ODBC などの汎用的なデータプロバイダを除いて、
基本的に、DBMS 毎に、データプロバイダが用意されている。
以下の様な特徴のあるデータ・アクセス方法がある。
(以下が、データ・アクセス方法、全てでは無い)。
補足(主要クラスの関係): ADO.NET の基本クラスは
System.Data.Commonの抽象クラスとして定義され、
データプロバイダがこれを実装する。
抽象クラス SqlClient の実装 役割 DbConnectionSqlConnection接続 DbCommandSqlCommandSQL / ストアドの実行 DbParameterSqlParameterパラメータ DbDataReaderSqlDataReader前方専用の読み取り DbDataAdapterSqlDataAdapterDataSetとの橋渡しDbTransactionSqlTransactionローカル トランザクション 複数リソースにまたがるトランザクションは
TransactionScope(→ MS-DTC)で扱う。
ADO.NET vs ORM (Entity Framework, Dapper)
Tags: 移行, データアクセス, .NET開発, ADO.NET
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。