#ls2()

#contents

#br

* 前提条件 [#tb1c191f]

** データアクセス基盤技術 [#r4432a1b]
- データベースへアクセスするためのコードは、ADO.NETに従い、.NET Framework Data Provider for SQL Serverが提供するクラス群を用いて実装する。
- IDbCommand , IDbConnectionインターフェイス等を用いて、SQL Serverに依存するコードを分離することは技術的に可能。しかし、技術的な制約や作業の手間が増えるため、要件として必要な場合(設定のみで異なるDBMSに対応させたい?)のみ利用する。
- MDACベースのADOと、ADO.NETは全く別物なので注意すること。
- また、ODBCはレガシーテクノロジなので、新規に利用すべきではない。

** データアクセスモデル [#m7bc3108]
- .NETを利用してRDBMSからデータを読み出す方式として、接続型モデルと非接続型モデルの2種類が存在することを意識し、場合に応じて最適な方法を選択すること。または、どちらかの方式を既定とし、もう一方の方式は例外的に利用すること。
- DataReader … 接続型モデル。高速。バッチ向き。
- DataTable …非接続型モデル。データソース接続を占有しない。オンライン処理向き。


* データアクセス共通 [#tc41f8d7]

** トランザクション制御 [#s30ac8ef]
- トランザクション制御は、TransactionScopeクラスを用いて行うとよい。

** トランザクションとコネクションの関係 [#r429b98e]
- 同じDBに対してアクセスする場合、1つのTransaction内では1つのSqlConnectionオブジェクトを共有する。
- つまり、1つのTransaction内では、複数のSqlConnectionオブジェクトをインスタンス化しない。接続文字列が同じでもダメ。
-- [Why] 分散トランザクションに昇格させないため。

** SQLパラメータ [#l67af98b]
- ADO.NETのSqlParameterクラスとパラメータ化ステートメントを用いることとし、入力パラメータをリテラル文字列でSQL文に挿入しない。
-- それにより、SQLクエリ文字列の無害化(SQLインジェクション対策)と、UNICODE UCS-2 文字 セットを使用する文字データ型(nchar, nvarchar, ntext)への対応を担保する。

** ロックヒント [#m2661cd0]
- 基本的には、各々のSQL文にロックヒントは明示しない。
- 指定が必要な場合には、識者と十分に検討する。

** フォーマット変換 [#d4f8db2a]
- DB層、DBアクセス層では、データの表示を意識したフォーマット変換を行わない。書式変換処理は、プレゼンテーション層や外部I/F層で行う。

** Connection管理 [#r7ccd37e]
- DB接続管理は共通化し、個別にSqlConnectionインスタンスを生成しないこと。

** DBカラム型とC#基本データ型のマップ [#q7aa43c1]
- データ更新時の入力データ型については、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|

** パラメータでのカラム型指定 [#jd04b3ba]
- SqlParameterオブジェクトにはカラム型を指定する。
- 無指定の場合、nvarcharとなり、性能劣化の原因となる場合がある。

** DbNullの扱い [#e49719c5]
- DataTableの文字列型カラムでは、NullValueプロパティに「(Empty)」を指定することによって、Null参照例外を防止する。
- SQL Serverでは、空の文字列とNull値は、別の値として扱われる。Null値の扱いについて、Oracleとは差異があるので注意すること。

* 接続型モデル(DataReader) [#j246f848]

** ConnectionのClose [#me65823f]
- 接続の閉塞が確実に行われるように、意識して実装すること。
- using句を用いると良い。


* 非接続型モデル(DataTable) [#g84f14eb]

** 排他制御 [#ra031375]
- 楽観的(または悲観的)排他制御が確実に行われるように、意識して実装すること。

** データサイズ [#x45a1c4f]
- 過度に大量のデータを読み込まないように留意すること。

** 参照系と更新系で別のDataSetとする。 [#n0347055]
- 参照系と更新系のDataSetは、別々に作成する。
- 更新系のDataTableのスキーマは、物理テーブルと完全に同じスキーマ定義にするとよい。

** 型付DataTableを利用する。 [#kbd35ca2]
- 実装利便性、ビルド時チェック可能等の観点から、DataSetは型付を利用する。


----
* 参考 [#y7e592ab]
- http://msdn.microsoft.com/ja-jp/library/cc419188.aspx

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS