Last-modified: 2009-07-30 (木) 14:33:31 (5597d)

'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基本データ型
    varbinarySystem.Byte[]
    bitSystem.Boolean
    textSystem.String
    tinyintSystem.Byte
    floatSystem.Double
    bigintSystem.Int64
    varcharSystem.String
    nvarcharSystem.String
    ntextSystem.String
    decimalSystem.Decimal
    smallmoneySystem.Decimal
    sql_variantSystem.Int32
    imageSystem.Byte[]
    datetimeSystem.DateTime
    realSystem.Single
    intSystem.Int32
    numericSystem.Decimal
    moneySystem.Decimal
    ncharSystem.String
    smalldatetimeSystem.DateTime
    smallintSystem.Int16
    binarySystem.Byte[]
    charSystem.String

パラメータでのカラム型指定

  • SqlParameterオブジェクトにはカラム型を指定する。
  • 無指定の場合、nvarcharとなり、性能劣化の原因となる場合がある。

DbNullの扱い

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

接続型モデル(DataReader)

ConnectionのClose

  • 接続の閉塞が確実に行われるように、意識して実装すること。
  • using句を用いると良い。

非接続型モデル(DataTable)

排他制御

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

データサイズ

  • 過度に大量のデータを読み込まないように留意すること。

参照系と更新系で別のDataSetとする。

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

型付DataTableを利用する。

  • 実装利便性、ビルド時チェック可能等の観点から、DataSetは型付を利用する。

参考


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