共通ドキュメント

データアクセス

概要

  • 設定
  • データ接続
  • コマンド
  • テーブル単体の操作
  • 複雑なテーブルアクセス
  • DataAccessクラス
  • 例外処理
  • 新しいデータ接続クラスの作成(C#)

設定

設定項目

基本設定項目
dataAccessセクション名
defaultConnectionTimeout接続タイムアウトの既定値。設定要素に設定されていない場合の既定値とする。接続がタイムアウトするまでの時間を秒で指定する。
defaultCommandTimeoutクエリーコマンドタイムアウトの既定値。設定要素に設定されていない場合の既定値とする。クエリーコマンドがタイムアウトするまでの時間を秒で指定する。 60秒以上は指定しない。ここにそれ以上の値を指定しなければ動作しないシステムは設計がおかしいか配置がおかしいか他何かが間違っている。
設定要素

addタグにより個別の接続に対する設定を記述する。

name設定要素名。重複は許されない。"default"の名前を持つ設定要素が必ず1つ必要。"/"(スラッシュ)で区切った文字を指定する事でプログラムからの設定名称指定を柔軟に出来る。
className実際に使用するConnectionの実装クラス名を記述する。
現在の実装はSQLServer,webサービスへの接続
url接続先のURLを記述する。webサービスの場合は http://exapmle.com:8000/service/function.aspx のような形式になる。
database接続先のデータベース名を記述する。webサービスの場合は 使用しない。
user接続先のデータベースを使用するためのユーザー名を記述する。webサービスの場合は基本認証またはダイジェスト認証のためのユーザー。
password接続先のデータベースを使用するためのパスワードを記述する。webサービスの場合は基本認証またはダイジェスト認証のためのパスワード。
quoteStyle引用記号処理のためのスタイルを記述する。0:SQLサーバー(シングルクォーテーションを二重化、ワイルドカード文字を"[]"(ブラケット)で囲む)
commandTimeoutこの接続でのクエリーコマンドタイムアウトの既定値。クエリーコマンドがタイムアウトするまでの時間を秒で指定する。記述しない場合は基本設定項目の値を使用する。長い値を指定してはならない。ほとんどのクエリーに300秒などありえない。
defaultConnectionTimeoutこの接続での接続タイムアウトの既定値。接続がタイムアウトするまでの時間を秒で指定する。記述しない場合は基本設定項目の値を使用する。
encryptUserユーザー名、パスワードを暗号化するか。デフォルトはtrue。
option上記に現れないオプション。SqlServerなら統合認証モード使用、接続プール数など
設定例

SQLサーバーに接続するデフォルト接続、webサービスに接続する"webservice"接続、顧客別接続(デフォルトとコード="A001"用の接続)。


<!-- デフォルト接続  -->
<dataAccess defaultConnectionTimeout="15" defaultCommandTimeout="45">
<add name="default" 
     className="CFW.Database.SqlServer.SqlServerConnection,CFW.Database" 
     url="dbserver.example.com" 
     database="sampledb"
     user="sample" 
     password="sample" 
     quoteStyle="0"
     commandTimeout="15" 
     connectionTimeout="15" 
     option="" 
     />
<!-- webサービスに接続する  -->
<add name="webservice" 
     className="CFW.Database.DbWebServiceReference.DbWebServiceReference,CFW.Database.DbWebServiceReference" 
     url="http://webservice.example.com/webservice.asmx" 
     database=""
     user="sample" 
     password="sample" 
     quoteStyle="0"
     commandTimeout="15" 
     connectionTimeout="15" 
     option="" 
     />
<!-- 顧客別接続  -->
<add name="customers" 
     className="CFW.Database.DbWebServiceReference.DbWebServiceReference,CFW.Database.DbWebServiceReference" 
     url="http://webservice.example.com/webservice.asmx" 
     database=""
     user="sample" 
     password="sample" 
     quoteStyle="0"
     commandTimeout="15" 
     connectionTimeout="15" 
     option="" 
     />
<!-- 顧客別接続(コード=A001用)  -->
<add name="customers/A001" 
     className="CFW.Database.DbWebServiceReference.DbWebServiceReference,CFW.Database.DbWebServiceReference" 
     url="http://webservice.example.com/webservice.asmx" 
     database=""
     user="sample" 
     password="sample" 
     quoteStyle="0"
     commandTimeout="15" 
     connectionTimeout="15" 
     option="opt1=value;opt2=value" 
     />
</dataAccess>

データ接続

データベース実体への操作を行う。

処理手順

データ接続の操作は以下の手順で行う。

  1. データ接続の取得
  2. 開始処理
  3. 各種操作の実行
  4. 終了処理

データ接続の取得

CFW.Database.ConnectionFactory を使用してCFW.Database.Connection オブジェクトを受け取る。

GetConnectionByNameは次のような指定が可能

  • 設定要素名指定。
    たとえば"default","someConnection","someCompany"など。
  • "/"で区切られた設定要素名の各要素。
    会社コード、サブシステム、機能からなる設定要素名を設定する場合
    設定要素名 "A001/PM/DRAFT"
    指定 GetConnectionByName("A001","PM","DRAFT") (<- C#) など。

開始処理

Connection#Open()を呼び出し接続を開く

処理内容により適宜 Connection#BeginTransaction()を呼び出しトランザクションを開始する。

各種操作の実行

Connection#ExecuteQuery,Connection#ExecuteUpdateなどを使用してデータベース操作を実行する。

または別のDataAccessクラス・TableAccessクラスのデータベース操作メソッドを使用する。

Connectionクラスに定義されたメソッド
ExecuteQuery選択Commandを実行し、結果をDataSetで返す。
ExecuteQueryAsTableRows選択Commandを実行し、結果を指定したTableRow型のリストで返す。
ExecuteUpdate更新系Commandを実行し、影響を受けた行数を返す。またはストアドプロシージャのリターン値を返す。
ExecuteReader(webサービスとデータ接続実体を統合して扱う都合上実装は存在するが使用できない)
ExecuteQueryBatch選択Commandの配列を個別に実行し、全ての結果を一つのDataSetにまとめて返す。
ExecuteUpdateBatch更新系Commandの配列を個別に実行し,影響を受けた行数を返す。またはストアドプロシージャのリターン値を返す。
TableAccessクラスに定義されているメソッド
InsertTableRowオブジェクトをテーブルに挿入する。
TablePropertiesの各フィールドのDoUpdateプロパティをtrue/falseに設定する事で挿入対象列を指定できる(対象にしない列はテーブルのデフォルト値が設定される)。
UpdateTableRowオブジェクトの内容でテーブルを更新する。選択対象は指定オブジェクトの主キー、または他の検索条件。
TablePropertiesの各フィールドのDoUpdateプロパティをtrue/falseに設定する事で更新対象列を指定できる。
DeleteTableRowオブジェクトの主キー情報に該当する行をテーブルから削除する。または他の検索条件に該当する。行をテーブルから削除する。
GetTableRowオブジェクトの主キー情報に該当する行を取得する。
GetList指定検索条件に該当する行のリストを取得する。
他のDataAccessクラスに定義されている(定義される予定の)メソッド
Insertエンティティを追加する。
Updateエンティティを更新する。
Deleteエンティティを削除する。
Getエンティティを取得する。
GetListエンティティのリストを取得する。

終了処理

開始されたトランザクションがあるなら Connection#RollbackTransaction() または Connection#CommitTransaction() を呼び出しトランザクションを終了する。

Connection#Close()を呼び出し接続を閉じる

注意

  • Connectionの実装クラスを直接生成(new)してはならない。(できないはず)
  • 文字列のみを受け取る ExecuteXxxx メソッドはない。作成予定もない。実装クラスに追加してはならない。必ず Commandオブジェクトを生成し実行する事。
  • 動的パラメータをクエリー文字列内に直接記述しない。必ずパラメータクエリーを作成し、Parameterオブジェクトを使用する。
  • ストアドプロシージャから出力引数を受け取る機能はない。出力が必要なら結果セットを返却させる。
  • どこで使用するか不明な Connection オブジェクトをOpenした状態で放置してはならない。
  • Open、Close、トランザクション操作は1メソッド内で使用する。
  • 例外処理必須。最低限ログを出力する。例外を再送出するか新たな例外を送出するかは仕様による。

コマンド

データベース操作のためのコマンド。クエリー文字列またはストアドプロシージャ名とパラメータからなる。

生成

  • クエリー文字列、クエリータイプから CFW.Database.Command クラスの新規インスタンスを生成する。
  • TableAccessクラスのコマンド生成メソッドから取得する

実行

開かれているConnectionオブジェクトのExecute**** メソッドを呼び出す。

注意

動的パラメータをクエリー文字列内に直接記述しない。必ずパラメータクエリーを作成し、Parameterオブジェクトを使用する。

テーブル単体の操作

テーブル単体の直接操作クエリーは避け、TableAccessクラス(t2m.exeにより自動生成)を通して操作する。

主キーによる選択

TableAccessクラスのGetメソッドを使用する。

各種検索条件指定によるテーブル単体の選択

TableAccessクラスのGetListメソッドを使用する。

テーブルへの追加

TableAccessクラスのInsertメソッドを使用する。

TablePropertiesクラスの各フィールドのDoUpdateフラグを設定する事で対象列を選択できる。

テーブルの更新

TableAccessクラスのUpdateメソッドを使用する。

TableCommandConditionクラスを使用することで対象行を選択できる。

TablePropertiesクラスの各フィールドのDoUpdateフラグを設定する事で対象列を選択できる。

テーブルからの行削除

TableAccessクラスのDeleteメソッドを使用する。

TableCommandConditionクラスを使用することで対象行を選択できる。

複雑なテーブル操作

結合テーブルからの選択(A)

クエリー記述時、選択列に 「テーブル別名 + "__"(アンダースコア2個) + 元の列名」からなる別名をつける。TableRowオブジェクトまたはエンティティへの展開はTableRowクラスのFromDataRowを使用する。

結合テーブルからの選択(B)

TableSelectCommandクラスを使用してCommandを組み立てる。TableRowオブジェクトまたはエンティティへの展開はTableRowクラスのFromDataRowを使用する。

DataAccessクラス

特定ドメインモデルのデータアクセスのためにDataAccessクラスを作成する。

必要な要素

  • 一つ以上のデータ接続
  • 各種データアクセスメソッド

例 - 選択クエリー実行(C#)

//"default"接続を取得。
Connection connection = ConnectionFactory.GetConnectionByName("default");
try{
  //接続を開く。
  connection.Open();
  //クエリー文字列準備。
  string query = @"select * from MST_CITY where CITY_CODE=@cityCode";
  Command command = new Command(query,CommandType.Text);
  //パラメータ設定。
  command.SetParameter(new CFW.Database.Parameter( "@cityCode",DbType.String,"1"));
  //実行
  DataSet result = connection.ExecuteQuery(command);

}
catch(CFW.Database.ConnectionException ex){
  // 接続例外の処理
  // 例外をログに出力する
  ErrorHandler handler = ErrorHandlerFactory.GetInstance(ex);
  handler.WriteLog();
  // 他の例外処理を記述...
}
finally{
  connection.Close();
}
例 - 更新クエリー実行(C#)

//"default"接続を取得。
Connection connection = ConnectionFactory.GetConnectionByName("default");
try{
  //接続を開く。
  connection.Open();
  //トランザクション開始。
  connection.BeginTransaction();
  //クエリー文字列準備。
  string query = @"update MST_CITY set AREAS_CODE = @areasCode where CITY_CODE=@cityCode";
  Command command = new Command(query,CommandType.Text);

  //パラメータ設定。
  command.SetParameter(new CFW.Database.Parameter( "@areasCode",DbType.String,"JPN"));
  command.SetParameter(new CFW.Database.Parameter( "@cityCode",DbType.String,"1"));

  //実行
  int result = connection.ExecuteUpdate(command);

  //トランザクション確定。
  connection.CommitTransaction();
}
catch(CFW.Database.ConnectionException ex){
  // トランザクションを破棄する
  connection.RollbackTransaction();
  // 接続例外の処理
  // 例外をログに出力する
  ErrorHandler handler = ErrorHandlerFactory.GetInstance(ex);
  handler.WriteLog();
  // 他の例外処理を記述...
}
finally{
  connection.Close();
}
例 - 色々な設定要素を使う(C#)


//設定要素"draft"に記述された接続設定を使用する。
Connection defaultConnection = ConnectionFactory.GetConnectionByName("default");

//設定要素"A001/PM/DRAFT"に記述された接続設定を使用する。
//ここではC#の可変引数機能を使用して"/"区切り要素を渡す。
Connection specialCompanyConnection = ConnectionFactory.GetConnectionByName("A001","PM","DRAFT");

例外(C#)

Connectionクラスはデータベースエラー他が発生した場合CFW.Database.ConnectionExceptionを送出する。

ConnectionExceptionの内容

Message例外メッセージ。SQLサーバーの場合元の例外メッセージ
ErrorNumberデータベースで設定されているエラー番号。SQLサーバーの場合sysmessagesテーブルのid
Stateメッセージ内容を識別する数字。SQLサーバーの場合のみ。
Serverエラーの発生したデータベースサーバー。SQLサーバーの場合のみ。
Procedure実行したストアドプロシージャ名。SQLサーバーの場合のみ。
LineNumberエラーの発生した行番号。SQLサーバーの場合のみ。
Commands実行したCFW.Database.Commandのリスト。

例外時のログ出力は CFW.Database.ConnectionExceptionHandler#WriteLogに実装されている。上記内容を全てログに出力する。

新しいデータ接続クラスの作成(C#)

実装されていない種類のデータ接続クラスを作成する場合、CFW.Database.Connection を継承するクラスを作成し抽象メソッドを実装する。

抽象メソッドの内容

Open設定内容から接続の実体(SqlConnection,OracleConnectionなど)を生成し、開く。
BeginTransaction接続実体に対応したトランザクションオブジェクトを生成し、トランザクションを開始する。
CommitTransaction既に開始されているトランザクションをコミットする。
RollbackTransaction既に開始されているトランザクションを破棄する。
CreateDbCommand接続実体に対応したIDbCommandをCommandオブジェクトの内容で生成する。
CreateDataAdapter接続実体に対応したIDataAdapterを生成する。
SystemDate接続実体に対応した現在時間取得クエリーを実行し、日付を返す

オーバーライド

実装されているが処理内容を変更する場合は適宜オーバーライドする。