'development guideline/ADO.NET/' には、下位層のページがありません。
前提条件 †
データアクセス基盤技術 †
- データベースへアクセスするためのコードは、ADO.NETに従い、.NET Framework Data Provider for SQL Serverが提供するクラス群を用いて実装する。
- IDbCommand , IDbConnectionインターフェイス等を用いて、SQL Serverに依存するコードを分離することは技術的に可能。しかし、技術的な制約や作業の手間が増えるため、要件として必要な場合(設定のみで異なるDBMSに対応させたい?)のみ利用する。
- MDACベースのADOと、ADO.NETは全く別物なので注意すること。
- また、ODBCはレガシーテクノロジなので、新規に利用すべきではない。
データアクセスモデル †
- .NETを利用してRDBMSからデータを読み出す方式として、接続型モデルと非接続型モデルの2種類が存在することを意識し、場合に応じて最適な方法を選択すること。または、どちらかの方式を既定とし、もう一方の方式は例外的に利用すること。
- DataReader … 接続型モデル。高速。バッチ向き。
- DataTable …非接続型モデル。データソース接続を占有しない。オンライン処理向き。
データアクセス共通 †
トランザクション制御 †
- トランザクション制御は、TransactionScopeクラスを用いて行うとよい。
トランザクションとコネクションの関係 †
- 同じDBに対してアクセスする場合、1つのTransaction内では1つのSqlConnectionオブジェクトを共有する。
- つまり、1つのTransaction内では、複数のSqlConnectionオブジェクトをインスタンス化しない。接続文字列が同じでもダメ。
- [Why] 分散トランザクションに昇格させないため。
SQLパラメータ †
- ADO.NETのSqlParameterクラスとパラメータ化ステートメントを用いることとし、入力パラメータをリテラル文字列でSQL文に挿入しない。
- それにより、SQLクエリ文字列の無害化(SQLインジェクション対策)と、UNICODE UCS-2 文字 セットを使用する文字データ型(nchar, nvarchar, ntext)への対応を担保する。
ロックヒント †
- 基本的には、各々のSQL文にロックヒントは明示しない。
- 指定が必要な場合には、識者と十分に検討する。
フォーマット変換 †
- DB層、DBアクセス層では、データの表示を意識したフォーマット変換を行わない。書式変換処理は、プレゼンテーション層や外部I/F層で行う。
Connection管理 †
- DB接続管理は共通化し、個別にSqlConnectionインスタンスを生成しないこと。
DBカラム型とC#基本データ型のマップ †
- データ更新時の入力データ型については、DBカラム型とのマッピングに合わせること。
DBカラム型*CLR基本データ型
varbinary | System.Byte[] |
bit | System.Boolean |
text | System.String |
tinyint | System.Byte |
float | System.Double |
bigint | System.Int64 |
varchar | System.String |
nvarchar | System.String |
ntext | System.String |
decimal | System.Decimal |
smallmoney | System.Decimal |
sql_variant | System.Int32 |
image | System.Byte[] |
datetime | System.DateTime |
real | System.Single |
int | System.Int32 |
numeric | System.Decimal |
money | System.Decimal |
nchar | System.String |
smalldatetime | System.DateTime |
smallint | System.Int16 |
binary | System.Byte[] |
char | System.String |
パラメータでのカラム型指定 †
- SqlParameterオブジェクトにはカラム型を指定する。
- 無指定の場合、nvarcharとなり、性能劣化の原因となる場合がある。
DbNullの扱い †
- DataTableの文字列型カラムでは、NullValueプロパティに「(Empty)」を指定することによって、Null参照例外を防止する。
- SQL Serverでは、空の文字列とNull値は、別の値として扱われる。Null値の扱いについて、Oracleとは差異があるので注意すること。
接続型モデル(DataReader) †
ConnectionのClose †
- 接続の閉塞が確実に行われるように、意識して実装すること。
- using句を用いると良い。
非接続型モデル(DataTable) †
排他制御 †
- 楽観的(または悲観的)排他制御が確実に行われるように、意識して実装すること。
データサイズ †
- 過度に大量のデータを読み込まないように留意すること。
参照系と更新系で別のDataSetとする。 †
- 参照系と更新系のDataSetは、別々に作成する。
- 更新系のDataTableのスキーマは、物理テーブルと完全に同じスキーマ定義にするとよい。
型付DataTableを利用する。 †
- 実装利便性、ビルド時チェック可能等の観点から、DataSetは型付を利用する。
参考 †