共通ドキュメント

データアクセス

概要

  • 設定
  • データ接続
  • コマンド
  • テーブルへのアクセス
  • 複雑なテーブルアクセス

設定

設定項目

基本設定項目
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接続先のデータベースを使用するためのユーザー名を記述する。
password接続先のデータベースを使用するためのパスワードを記述する。
quoteStyle引用記号処理のためのスタイルを記述する。0:SQLサーバー(シングルクォーテーションを二重化、ワイルドカード文字を"[]"(ブラケット)で囲む)
commandTimeoutこの接続でのクエリーコマンドタイムアウトの既定値。クエリーコマンドがタイムアウトするまでの時間を秒で指定する。記述しない場合は基本設定項目の値を使用する。長い値を指定してはならない。ほとんどのクエリーに300秒などありえない。
defaultConnectionTimeoutこの接続での接続タイムアウトの既定値。接続がタイムアウトするまでの時間を秒で指定する。記述しない場合は基本設定項目の値を使用する。
設定例

SQLサーバーに接続する。


  <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="" 
         />
  </dataAccess>
 

データ接続

コマンド

テーブルへのアクセス

複雑なテーブルアクセス

使用方法

  1. CFW.Database.ConnectionFactory#GetConnectionByName()を使用してCFW.Database.Connectionを受け取る。
  2. Connection#Open()を呼び出し接続を開く
  3. 処理内容により適宜 Connection#BeginTransaction()を呼び出しトランザクションを開始する。
  4. CFW.Database.Commandオブジェクトを生成し、Connection#ExecuteQuery、Connection#ExecuteUpdate、etc...を実行する。
  5. 開始されたトランザクションがあるなら Connection#RollbackTransaction() または Connection#CommitTransaction() を呼び出しトランザクションを終了する。
  6. Connection#Close()を呼び出し接続を閉じる

注意

  • 文字列のみを受け取る ExecuteXxxx メソッドはない。作成予定もない。作成してはならない。必ず Commandオブジェクトを生成し実行する事。
  • 動的パラメータをクエリー文字列内に直接記述しない。必ずパラメータクエリーを作成し、Parameterオブジェクトを使用する。
  • どこで使用するか不明な Connection オブジェクトをOpenした状態で放置してはならない。
  • Open、Closeは1メソッド内で使用する。
  • 例外処理必須。最低限ログを出力する。例外を再送出するか新たな例外を送出するかは仕様による。

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

Connection connection = ConnectionFactory.GetConnectionByName("default");
connection.Open();
try{
	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(Exception ex){
	ErrorHandler handler = ErrorHandler.GetInstance(ex);
	handler.WriteLog();
}
finally{
	connection.Close();
}
 
例 - 更新クエリー実行(C#)

Connection connection = ConnectionFactory.GetConnectionByName("default");
connection.Open();
try{
	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);
	
}
catch(Exception ex){
	ErrorHandler handler = ErrorHandler.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#)

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

抽象メソッドの内容

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

オーバーライド

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