Skip to content

MS_ADONET

nishi_74322014 edited this page Aug 18, 2026 · 2 revisions

ADO.NET

概要

.NET で高速かつ汎用的に DB アクセスを行う
UDA(Microsoft Universal Data Access)を実現する
ADO の後継となる .NET 用データプロバイダ(標準オブジェクト モデル)。

この標準オブジェクト モデルには、DB から読み出したデータを格納する
データセット、データテーブル等のクラスが提供されており、柔軟な利用が可能である。

非接続型のデータアクセスを推奨している。

補足(用語の整理): 「非接続型(disconnected)」とは、
接続を保持したまま処理しないという意味であり、
DB に接続せずに動くという意味ではない。

代表クラス 特徴
接続型 DbDataReaderSqlDataReader 等) 前方専用・読み取り専用のストリーム。接続を保持したまま 1 行ずつ読む。最も高速でメモリ効率が良い
非接続型 DataSet / DataTable + DbDataAdapter 一括で読み込み、接続を切ってからメモリ上で操作。更新は Update でまとめて反映

非接続型が推奨されたのは、Web アプリのように
接続を長く握るとスケールしない構成が主流になったためである。

補足(最新化:現在の実装スタイル): 現在の .NET では、

  • DataSet / DataTable新規実装ではほぼ使われない
    (型付き DataSet も同様。POCO クラスへマッピングするのが標準)
  • 代わりに、DbDataReader から POCO へ詰め替えるか、
    ORM(EF Core / Dapper)を使う
  • I/O はすべて非同期 APIOpenAsync / ExecuteReaderAsync /
    ReadAsync)を用いる。ASP.NET Core ではスレッド枯渇を避けるため必須級
  • 接続は usingawait 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 インジェクションになる。

詳細

ADO.NETデータプロバイダ

ADO.NETデータプロバイダ

OLE DB や ODBC などの汎用的なデータプロバイダを除いて、
基本的に、DBMS 毎に、データプロバイダが用意されている。

データアクセスの方法

以下の様な特徴のあるデータ・アクセス方法がある。
(以下が、データ・アクセス方法、全てでは無い)。

DataAdapter

DataAdapter

TableAdapter

TableAdapter

補足(主要クラスの関係): ADO.NET の基本クラスは
System.Data.Common の抽象クラスとして定義され、
データプロバイダがこれを実装する。

抽象クラス SqlClient の実装 役割
DbConnection SqlConnection 接続
DbCommand SqlCommand SQL / ストアドの実行
DbParameter SqlParameter パラメータ
DbDataReader SqlDataReader 前方専用の読み取り
DbDataAdapter SqlDataAdapter DataSet との橋渡し
DbTransaction SqlTransaction ローカル トランザクション

複数リソースにまたがるトランザクションは
TransactionScope(→ MS-DTC)で扱う。

参考

ADO.NET vs ORM (Entity Framework, Dapper)

ADO.NET vs ORM (Entity Framework, Dapper)


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

NetDevInfraWiki

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

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally