|
#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