目次 1. はじめに ライセンス 動作環境 インストール DBee2 フレームワークの構成 DBeeContext DataProvider ParameterHelper..

Similar documents
Microsoft Word - Android_SQLite講座_画面800×1280

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

PowerPoint Presentation

データアダプタ概要

mySQLの利用

データベースアクセス

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

Microsoft PowerPoint ppt

Seasar.NET入門

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Microsoft認定資格問題集(70-483_demo)

プレポスト【問題】

スライド 1

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

目次 更新履歴... 1 はじめに... 3 レコードセット?... 3 準備... 5 SQL でデータを取得する... 6 データのループ処理... 7 列の値を取得する... 7 対象行を変更する (MoveFirst, MoveNext, MovePrevious, MoveLast)...

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

プログラミング基礎I(再)

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

PowerPoint プレゼンテーション

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

intra-mart Accel Platform

WEBシステムのセキュリティ技術

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

データベース暗号化ツール「D’Amo」性能検証

Caché SQL に関するよくある質問

PowerPoint Presentation

Microsoft Word - tutorial3-dbreverse.docx

TestDesign for Web

S2DaoでもN:Nできます

WebReportCafe

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

Java知識テスト問題

Microsoft認定資格問題集DEMO(70-513)

intra-mart Accel Platform

V8.1新規機能紹介記事

PowerPoint プレゼンテーション

スライド 1

SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

Prog2_12th

JavaプログラミングⅠ

LightSwitch で申請システム Windows ストアアプリで受付システムを構築してみた 情報政策グループ技術職員金森浩治 1. はじめに総合情報基盤センターでは 仮想サーバホスティングサービスや ソフトウェアライセンス貸与といった さまざまなエンドユーザ向けサービスを行っている 上記のよう

Microsoft PowerPoint - 4-MySQL50_JDBC_failover.ppt

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

Prog1_15th

Microsoft Word - Android_SQLite講座_画面800×1280

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

WebReportCafe

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

tkk0408nari

3/7 マイグレーション開発方針 顧客名 0 作成者 根岸正 < プログラム移行方針 > システム名称 A-VX システムマイグレーション作成日 2015/09/01 < COBOL 資産のプログラム移行 > COBOLソース ( メインとCOPYLIB) を入力としてSCC 言語変換ツールにてVB

— intra-mart Accel Platform セットアップガイド (WebSphere編)   第7版  

使用する前に

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Microsoft PowerPoint - prog03.ppt

PowerPoint Presentation

WCF と IIS を使用して OData プロデューサーを作成する

基礎計算機演習 実習課題No6

標準化 補足資料

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

MxLogonサーバサイドツールキット用UI

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft Word - Lab5d-DB2組み込みSQL.doc

Microsoft Word - wpphpmysql.doc

情報システム設計論II ユーザインタフェース(1)

CONTEC DIOプロバイダ ユーザーズガイド

TALON Tips < 親子関係のある構成データを TALON で表示する > 株式会社 HOIPOI 第 1.1 版 p. 1

Visual Basic Oracle Database 11 Release 1

MVP for VB が語る C# 入門

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

PowerPoint Presentation

Microsoft PowerPoint - Pro110111

Microsoft PowerPoint - chap10_OOP.ppt

ER/Studio Data Architect 2016 の新機能

Microsoft Word - JDBC検証 docx

人工知能入門

Javaプログラムの実行手順

ガイダンス

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

FW ファイルアップロード ダウンロード機能利用ガイド Version 年 9 月 21 日富士通株式会社 i All Right Reserved, Copyright FUJITSU LIMITED

Oracle SQL Developer Data Modeler

目次 目次 準備いただくもの 準備 SQLServer2008 R2 ExpressEdition のインストール インストールの前に インストール 設定一覧 機

プロバイダ ユーザーズガイド

テーブルの確認 sqlite>.tables.tables コマンドでデータベース内のテーブル一覧を表示する テーブルスキーマの表示 sqlite>.schema mytable.schema コマンドで指定のテーブルのスキーマを表示できる テーブル出力の整形.explain コマンドを使うと テー

TALON Tips < カレンダー ( 月別 ) の画面を表示する > 株式会社 HOIPOI 第 1.1 版 p. 1

问题集 ITEXAMPASS 1 年で無料進級することに提供する

Oracleセキュア・エンタープライズ・サーチ


第2回講義

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

日本語版目次 アーキテクチャに関するパターン : P035 振る舞いに関する問題 : P040 データの読み込み : P042 構造的なマッピングに関するパターン : P043 関係のマッピング : P043 継承 : P047 マッピングの構築 : P050 2 重のマッピング : P051 メタ

Java講座

復習 (SQL 文 ) 3/6 復習 (SQL 文 ) 4/6 表の作成 CREATE TABLE...; 表の削除 DROP TABLE テーブル名 ; 表内のデータが全て消えてしまう. 表内のデータを得る SELECT 列名 FROM 表名...; 表にデータを挿入する. INSERT INTO

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

NetworkVantage 9

Transcription:

DBee2 FrameWork (Ver.2.0.0) Developer Guide 著作者 :( 有 ) ブライト エル 2009.01.31 1

目次 1. はじめに... 4 2. ライセンス... 4 3. 動作環境... 4 4. インストール... 4 5. DBee2 フレームワークの構成... 5 5-1. DBeeContext... 6 5-2. DataProvider... 6 5-3. ParameterHelper... 8 5-4. DataReaderHandler... 9 5-5. SimpleSqlExecuter... 10 5-6. DynamicDto... 12 6. トランザクション管理... 13 7. チュートリアル ( 検索系 )... 14 6-1. サンプル用のデータベーステーブル... 14 6-2. 設定ファイル (DBeeConfig.xml)... 15 6-3. DBee2 の初期化... 17 6-4. DTO の準備... 19 6-5. ExecuteQueryForList による検索... 20 6-6. ExecuteQueryForDto による検索... 20 6-7. さまざまな ParameterHelper... 21 6-8. その他の検索系 SQL 実行メソッド... 22 6-9. DynamicDto の利用... 23 8. チュートリアル ( 更新系 )... 24 7-1. データの挿入サンプル... 24 7-2. データの更新サンプル... 24 7-3. データの削除サンプル... 25 7-4. 少し凝った更新サンプル... 25 7-5. トランザクションを明示的に行う... 26 9. チュートリアル ( プロシージャ系 )... 27 8-1. ParameterDirection... 28 8-2. OUT パラメータにおける注意点... 28 10. 設定ファイルの暗号化... 29 11. 複数データベースの接続... 29 2

3 DBee2 FrameWork Deveroper Guide

1. はじめに DBee2フレームワークは リレーショナルデータベースへアクセスするのに必要な.NETコーディングを著しく減少させる手助けをします DBee2フレームワークは シンプルなコードの記述でデータベースにアクセスすることが可能です SQLは自由にコード上に記述するタイプなので精通しているSQLの全ての機能が利用できます 2. ライセンスライセンスは Apache2のライセンスに準じます また 利用するライブラリのライセンスは そのライセンスに準じます 商用アプリケーションでの利用は可能ですが ソースコードを改造し販売などを行うことはできません 3. 動作環境.NET フレームワーク 2.0 3.0 3.5 4.0 上での利用が可能です 4. インストール配布物のDBee2.dll Log4net.dllをプロジェクトで参照すればすぐに使用できます ただし 使用するデータベースプロバイダがインストールされている またはプロバイダが利用するDLLをすべて参照できることが前提です 4

5. DBee2 フレームワークの構成 以下の図は DBee2 のフレームワーク構成概略を示します 5

5-1. DBeeContext DBee2 フレームワークをアプリケーションスコープ内で永続的に保持するためのシングルトンなクラスです DBee2 フレームワークの初期化を行うためには このクラスの GetInstance() メソッドのパラメータに設定ファイルのパスを指定し呼び出必要があります 5-2. DataProvider.NET フレームワークでは Java の JDBC とことなりデータベースアクセスのためのプロバイダが各データベースで用意されています DBee2 では Providers.xml ファイルに定義したプロバイダを選択し利用することができます つまり Oracle でも SQLServer でも AccessDB でも利用するデータベースに縛られません 逆にいえば Providers.xml ファイルに定義されているプロバイダであれば DBee2 では問題なく利用することが出来ます DataProvider の設定ファイルのパスは DBeeConfig.xml 内の providerconfig セクションに記述します <Connecter provider="oracleclient1.0"> の provider 属性に Providers.xml 内で記述されている name を記述することでプロバイダを指定します 6

以下にデータベースごとの設定例を記載します 1) Oracle(.NET フレームワーク純正プロバイダ ) <Configs providerconfig="providers.xml" sqltrace="true"> <Config dbname="oradb"> <Connecter provider="oracleclient1.0"> <ConnectionString iscrypt="false" > Data Source=mouse; User ID=sb; Password=sb;</ConnectionString> <Preserve>true</Preserve> <CommandTimeout>30</CommandTimeout> </Connecter> 2) Oracle(ODP.NET) <Configs providerconfig="providers.xml" sqltrace="true"> <Config dbname="oradb"> <Connecter provider="oracle10.2"> <ConnectionString iscrypt="false"> Data Source=mouse; User ID=sb; Password=sb;</ConnectionString> <Preserve>true</Preserve> <CommandTimeout>30</CommandTimeout> </Connecter> 3) SQLServer <Configs providerconfig="providers.xml" sqltrace="true"> <Config dbname="mssql"> <Connecter provider="sqlserver2005"> <ConnectionString iscrypt="false"> Data Source=mouse; User ID=sb; Password=sb;</ConnectionString> <Preserve>true</Preserve> <CommandTimeout>30</CommandTimeout> </Connecter> 7

5-3. ParameterHelper DBee2 では SQL へのパラメータ供給にはバインド変数を利用しています SQL インジェクションに強く 同一 SQL の繰り返し実行性能が優れているからです バインド変数を利用した実装ではデータベースのカラム型に合わせバインドする値をキャストするなど手順が複雑ですが DBee2 は プログラマにデータベースのカラム型をほとんど意識させません そのために用意されているのが ParameterHelper という仕組みです 1) DTO(Data Transfer Object) を利用する SQL 実行時に値を格納した DTO を利用します 作成する DTO のプロパティ名は発行する SQL 文の列名と同じである必要があります DtoCreatert というテーブル単位の DTO を自動生成する GUI ツールが含まれています 2) IDictionary を利用する SQL 実行時にハッシュに格納した値を利用します ハッシュのキー値は発行する SQL 文の列名と同じ である必要があります 3) IList を利用する SQL 実行時にリストに格納した値を利用します SQL 文に書かれたバインド変数の順番でパラメータをリストに格納する必要があります ODBC のようにパラメータ名概念がなく? のみの場合に使用してください 4) プロシージャ専用の ParameterHelper プロシージャ実行時の IN パラメータ OUT パラメータに対応したパラメータを定義することができます また プロシージャが戻す値の取得もこのクラスが受け持ちます 8

5-4. DataReaderHandler DBee2 では データベースの検索結果を実用的なクラスに変換してプログラマに返します また このオブジェクトは.NET フレームワークの様々なコントロールの DataSource としてそのまま利用することもできますので コーディング量を極端に減らすことが可能です 1) DTO(Data Transfer Object) を利用する 検索結果を格納した DTO 単体または DTO を格納した IList を戻します このオブジェクトは コントロールの DataSource としてそのまま利用できます 2) IDictionary を利用する 検索結果を格納したハッシュ単体または ハッシュを格納した IList を戻します ハッシュのキー値は発 行する SQL 文の列名となります 3) DataTable を利用する 検索結果を格納した DataTable を戻します このオブジェクトは コントロールの DataSource としてそのまま利用できます 4) Object を利用する 例えば テーブルのカウント結果 システム時間の取得など単一プリミティブな結果を格納します 5) IDataReader をそのまま利用する DBee2 では 利用者が型変換など意識しなくてもよいように IDataReader から検索結果をすべて読込み 検索結果保持用のオブジェクトにデータをバインドしています そのため 極端な大量データを検索結果として扱う場合には OutOfMemory エラーが発生する可能性があります ( バッチや移行処理などで数百万件といったデータを処理するケース ) そのような場合は このメソッドを利用し IDataReader を直接操作してください 9

5-5. SimpleSqlExecuter SQL の実行を受け持つクラスです 大きくは検索系 更新系 プロシージャの実行の 3 つの機能を提供し ています 1) 検索系メソッド検索系の SQL を実行するメソッド群です DBee2 で SQL を実行するには 基本的に 実行する SQL 文 ParameterHelper( パラメータ ) DataReaderHandler( データ取得オブジェクト ) の 3 つをパラメータとして渡すだけです 1 object ExecuteQueryForDto(string sql, IParameterHelper helper, Type model); helper で指定されたパラメータをもとに model で指定された DTO クラスへ検索結果を格納します 検索結果が単一行の場合に利用します 2 IList ExecuteQueryForList(string sql, IParameterHelper helper); helper で指定されたパラメータをもとに IDictionary のコレクションを検索結果として戻します 3 IList ExecuteQueryForList(string sql, IParameterHelper helper, Type model); helperで指定されたパラメータをもとに model で指定されたDTOクラスのコレクションを検索結果として戻します 4 IDictionary ExecuteQueryForMap(string sql, IParameterHelper helper); helper で指定されたパラメータをもとに IDictionary へ検索結果を格納します 検索結果が単一行の場合に利用します 5 object ExecuteQueryForObject(string sql, IParameterHelper helper); helper で指定されたパラメータをもとに 検索結果を Object として戻します 検索結果が単一行かつ単一列の場合に利用します 6 DataTable ExecuteQueryForDataTable(string sql, IParameterHelper helper); helper で指定されたパラメータをもとに 検索結果を DataTable として戻します 7 IDataReader ExecuteQueryForDataReader(string sql, IParameterHelper helper); helper で指定されたパラメータをもとに 検索結果を IDataReader として戻します 他のメソッドでは IDataReader から検索結果をすべて読込み 検索結果保持用のオブジェクトにデータを格納しています 大量データを検索結果として扱う場合で OutOfMemory エラーが発生する可能性がある場合は このメソッドを利用します このメソッドを利用した場合 IDataReader のクローズは SimpleSqlExecuter が Dispose されるまで行われませんので 明示的にクローズを行うか SimpleSqlExecuter を Dispose する必要があります 10

2) 更新系メソッド更新系の SQL を実行するメソッドです DBee で SQL を実行するには 基本的に 実行する SQL 文 ParameterHelper( パラメータ ) の 2 つをパラメータとして渡すだけです これらのメソッドは 一般的には戻り値として実行した件数を Object 型で戻します ( 詳細は各データベースプロバイダの ExecuteNonQuery メソッドの仕様を確認してください ) 1 int ExecuteInsert(string sql, object model); model(dto クラス ) のプロパティをバインド変数の値として SQL を実行します 2 int ExecuteInsert(string sql, IParameterHelper helper); helper に定義したパラメータをバインド変数の値として SQL を実行します 3 int ExecuteUpdate(string sql, object model); model(dto クラス ) のプロパティをバインド変数の値として SQL を実行します 4 int ExecuteUpdate(string sql, IParameterHelper helper); helper に定義したパラメータをバインド変数の値として SQL を実行します 5 int ExecuteDelete(string sql, object model); model(dto クラス ) のプロパティをバインド変数の値として SQL を実行します 6 int ExecuteDelete(string sql, IParameterHelper helper); helper に定義したパラメータをバインド変数の値として SQL を実行します 7 int ExecuteDDL(string sql); DDL 文を実行します 3) プロシージャ系メソッドプロシージャを実行するための専用メソッドです DBee2 でプロシージャを実行するには 基本的に 実行するプロシージャ名 ParameterHelper( パラメータ ) DataReaderHandler( データ取得オブジェクト ) の 3 つをパラメータとして渡すだけです 1 object ExecuteProcedure(string sql, ProcedureParameterHelper helper, IDataReaderHandler handler); helper で指定されたパラメータをもとにプロシージャを実行します OUT パラメータの値は helper で指定します SQLServer のようにプロシージャの実行で検索結果を発生させる場合は handler で指定したオブジェクトに結果を戻します 2 object ExecuteProcedureForObject(string sql, ProcedureParameterHelper helper); helper で指定されたパラメータをもとにプロシージャを実行します OUT パラメータの値は helper で指定します SQLServer のようにプロシージャの実行で検索結果を発生させる場合はオブジェクトに結果を戻します 11

3 DataTable ExecuteProcedureForDataTable(string sql, ProcedureParameterHelper helper); helper で指定されたパラメータをもとにプロシージャを実行します OUT パラメータの値は helper で指定します SQLServer のようにプロシージャの実行で検索結果を発生させる場合は DataTable に結果を戻します 5-6. DynamicDto 従来 ParameterHelper や DataReaderHandler で利用する DTO クラス (Data Transfer Object) は ツールを利用するか 自前でコーディングし静的なクラスを用意する必要がありました DBee2では この DTO クラスを DB スキーマより自動的に作成する DynamicDto という機能を提供します 設定ファイルの IsDynamicDto の指定で 接続 DB 毎に DynamicDto 機能を利用するかどうかを設定できます DynamicDto を利用すると DBee2 の初期化時に DB スキーマを解析し動的にテーブル単位の DTO クラスを生成します (DynamicDto は まだすべての DB プロバイダには対応していません Providers.xml にて usertables タグが設定されているプロバイダのみ利用が可能です ) DynamicDto は DB スキーマを解析して Bl.DBee2.DynamicDto 名前空間以下に DTO クラスを生成します 作成されるクラスは DLL ファイルとしてではなく メモリ空間上に展開されます なお DTO のアセンブリ名は 以下の命名規則で作成されます Bl.DBee2.DynamicDto. 設定ファイルの DB 名 ( ドットを含む場合はドットを削除します ). テーブル名 DynamicDto を利用した SQL の実行には DynamicSqlExecuter クラスを DTO からの値の取得には DynamicValueHandler を提供しています これらのクラスを利用すれば アセンブリ名ではなくテーブル名で DTO にアクセスすることが出来ます また ParameterHelper での DynamicDto 利用には DynamicDtoParameterHelper クラスを提供します このクラスも同様にテーブル名で DTO にデータをセットすることが出来ます 注意 : スキーマに存在するテーブル数にもよりますが DynamicDto がクラスを生成 コンパイルするのには それなりに時間を要します サーバーアプリケーションなど常駐型のアプリでの使用であればいいですが クライアントアプリケーションの場合 アプリの起動に時間を要する場合が発生しますので 利用にあたっては十分検討をしてください 12

6. トランザクション管理 DBee2 では 明示的なトランザクション処理を行わなければ SimpleSqlExecuter または DynamicSqlExecuter のメソッドの実行単位が 1 トランザクションとなり エラーが発生すれば自動的にロールバックを行います 明示的にトランザクション管理を行えば 自由にトランザクションの範囲を設定することも可能です 最近ではローカルトランザクションの他にも DTC TracsactionScope CommittableTransaction などの多彩なトランザクション管理が利用できるようになりました しかし プロバイダによってサポートするトランザクションが異なりますので DBee2 では ローカルトランザクション以外はサポートしていません DTC TracsactionScope CommittableTransaction を利用する場合は 独自にトランザクションを実装してください DBee2 では 以下のローカルトランザクション専用のクラスを提供しています LocalTxRequired トランザクションが存在する場合はこれを共有し 必要に応じて新しいトランザクションを作成します LocalTxRequiredNew 現在のコンテキストの状態とは関係なく 新しいトランザクションでコンポーネントを作成します このクラスを使用すると コードブロックがトランザクションに参加しているものとして簡単にマークすることが でき トランザクション自体と対話する必要がありません 13

7. チュートリアル ( 検索系 ) ここからは 実際に DBee2 をコーディングで利用する際の方法を説明していきます 6-1. サンプル用のデータベーステーブル サンプルコードを実行するためには 利用するデータベース上に以下と同等のテーブルを作成し適当なデー タを作成してください CREATE TABLE PERSON ( ID NUMBER (5, 0) NOT NULL, FIRST_NAME VARCHAR (40) NOT NULL, LAST_NAME VARCHAR (40) NOT NULL, BIRTH_DATE DATE, WEIGHT_KG NUMBER (4, 2) NOT NULL, HEIGHT_M NUMBER (4, 2) NOT NULL, PRIMARY KEY (ID) ) 14

6-2. 設定ファイル (DBeeConfig.xml) DBee2 で利用者が設定する設定ファイルは 1 つだけです この設定ファイルに DB の接続情報 利用するプロバイダなどを記述します <?xml version="1.0" encoding="utf-8"?> <Configs providerconfig="providers.xml" sqltrace="true"> <Config dbname="mydatabase"> <Connecter provider="mysql5.2"> <ConnectionString iscrypt="false">data Source=mouse; User ID=sb; Password=sb; database=sb; </ConnectionString> <Preserve>true</Preserve> <CommandTimeout>30</CommandTimeout> <IsDynamicDto> false </IsDynamicDto> </Connecter> <PoolSettings> <Pooling>false</Pooling> <MaxPoolSize>100</MaxPoolSize> <MinPoolSize>0</MinPoolSize> </PoolSettings> <TypeHandler dnettype="system.string" dbtype="varchar" callback="testdbee.testcallback"/> </Config> <Config dbname="oradatabase"> <Connecter provider="oracle10.1"> <ConnectionString>"Data Source=orcl; User ID=gyoumu; Password=gyoumu;"</ConnectionString> <Preserve>true</Preserve> <CommandTimeout>30</CommandTimeout> </Connecter> <PoolSettings> <Pooling>true</Pooling> <MaxPoolSize>100</MaxPoolSize> <MinPoolSize>0</MinPoolSize> <ValidateConnection>true</ValidateConnection> </PoolSettings> </Config> </Configs> 15

1) Configsセクションこのセクションは DBee2 全体の設定となります providerconfig Providers.xml のパスを定義します sqltrace 実行する SQL 文をデバッグ出力するかどうかを指定します exceptionlogging データベースエラーをログに出力するかを設定します アプリケーション独自にハンドルする場合は false を設定します 2) Config セクション DBee2 が 1 つのアプリケーションで接続を行うデータベースはいくつでもかまいません このセクションは各データベースへの接続定義を設定するものとなります dbname 任意の名前を定義します アプリケーション内で操作するデータベースを切り替える際にこの名前を利用します Preserver コネクションをトランザクションごとに取得するか アプリケーションで永続させるかを設定します Windows アプリケーションであれば True Web アプリケーションであれば false のように使い分けるとよいでしょう CommandTimeout SqlCommand のタイムアウト時間 ( 秒 ) を設定します ( デフォルト 30 秒 ) 3) Connecter セクション各プロバイダへの接続設定を行います provider 属性利用するプロバイダ名を指定します ここで指定できる名前は Providers.xml 内で定義されている名前となります ConnectionString 各プロバイダに接続するためのコネクションストリングを設定します プールに関する設定は 別途 PoolSettings セクションに記述します ConnectionString ConnectionString を暗号化しているかどうかを示します [iscrypt] このタグが false の場合 デバッグログに暗号化文字列を出力しますので暗号化する場合はその文字列を利用してください Preserver コネクションをトランザクションごとに取得するか アプリケーションで永続させるかを設定します Windows アプリケーションであれば True Web アプリケーションであれば false のように使い分けるとよいでしょう CommandTimeout SqlCommand のタイムアウト時間 ( 秒 ) を設定します ( デフォルト 30 秒 ) IsDynamicDto DynamicDto 機能を利用するかどうかを設定します 16

4) PoolSettings セクションコネクションプールの設定を行います プロバイダによってはプールをサポートしていない場合もありますので 各プロバイダの仕様を確認してください Pooling プールを行うかどうかを設定します Windows アプリケーションであれば false Web アプリケーションであれば true のように使い分けるとよいでしょう MaxPoolSize プールの最大サイズを設定します MinPoolSize プールの最小サイズを設定します ValidateConnection プールから取得したコネクションの検証を行う 5) TypeHandler セクション独自の TypeHandler を利用したい場合に利用します 例えば.NET の String クラス~データベースの VARCHAR にバインドする際に特別な処理を行いたい場合などに利用できます dnettype.net 側で扱う型を指定します providertype データベースの型に対してプロバイダが扱う型を指定します callback Bl.DBee2.Dao.TypeHandler. ITypeHandlerCallback インターフェースの実装クラスを指定します 設定ファイル名は 自由に変更してかまいません 設定ファイルは XML の encoding 属性で指定したファイルエンコードで必ず保存してください 6-3. DBee2 の初期化 DBee2 の初期化はいたって簡単です 以下のメソッドを 1 行記述するだけです DBeeContext.GetInstance( 設定ファイルパス ); コネクションの管理は DBee2 が全て請け負いますので コード上にコネクションに関する記述は一切出現 しません 17

using Bl.DBee.Context; namespace TestOracle static class Program [STAThread] static void Main() DBeeContext context = DBeeContext.GetInstance(@"config\DBeeConfig.xml"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); 18

6-4. DTO の準備 検索結果を格納するオブジェクトは複数提供していますが DTO の利用は何かと便利な場面が多いもの です このチュートリアルでも 以下のような DTO を作成します [System.SerializableAttribute()] public class Parson () private int _ID; private string _FIRST_NAME; private string _LAST_NAME; private DateTime _BIRTH_DATE; private decimal _WEIGHT_KG; private decimal _HEIGHT_M; public int ID get return _ID; set _ID = value; public string FIRST_NAME get return _FIRST_NAME; set _FIRST_NAME = value; public string LAST_NAME get return _LAST_NAME; set _LAST_NAME = value; public DateTime BIRTH_DATE get return _BIRTH_DATE; set _BIRTH_DATE = value; public decimal WEIGHT_KG get return _WEIGHT_KG; set _WEIGHT_KG = value; public decimal HEIGHT_M get return _HEIGHT_M; set _HEIGHT_M = value; テーブル単位の DTO であれば 付属の DtoCreater で作成することができます 19

6-5. ExecuteQueryForList による検索 では さっそく SimpleSqlExecuter の ExecuteQueryForList メソッドを利用して PERSON テーブルの全デ ータを取得するメソッドを作成してみましょう public IList GetAllParson() SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = "SELECT * FROM PERSON"; return executer.executequeryforlist(sql, null, typeof(person)); 検索条件の無い SQL ですので 実行時の引数に IParameterHelper は必要なく null を渡しています 検索結果は Person クラスのコレクションが戻ります 6-6. ExecuteQueryForDto による検索 次に ID を指定して WHERE 句のある SQL を実行するメソッドを作成してみます ( 以下 バインド変数は SqlServer を想定し @ で始まる変数を利用しています ) public Person GetParson(int userid) SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = "SELECT * FROM PERSON WHERE ID = @ID "; DictionaryParameterHelper helper = new DictionaryParameterHelper(); helper.addparameter("id", userid); return (Person)executer.ExecuteQueryForList(sql, helper, typeof(person)); このテーブルは ID 列がキーとなっていますので ID を指定した検索の戻り行は 1 レコードとなります 検索条件のパラメータには DictionaryParameterHelper クラスを利用しています このクラスは ハッシュによりパラメータを設定します helper.addparameter("id", userid); 部分が実際にパラメータをセットしている部分です SQL 文内のパラメータは @ID と書かれていることに注目してください これは 各データベースの方言に合わせて書くようにしてください 例えば Oracle であれば WHERE ID = :ID SQLServer であれば WHERE ID = @ID という各データベースが利用しているバインド変数の書式で記述します 20

6-7. さまざまな ParameterHelper ParameterHelper には数種類のクラスが提供されています 先の検索では DictionaryParameterHelper クラスを利用しましたが他のクラスを利用した場合のサンプルを以下に示します 1)DtoParameterHelper の利用 SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = @"SELECT * FROM PERSON WHERE WEIGHT_KG >= @WEIGHT_KG AND HEIGHT_M >= @HEIGHT_M "; Person person = new Person(); person.weight = 50.5m; person.height_m = 165.5m; DtoParameterHelper helper = new DtoParameterHelper (person); IList list = executer.executequeryforlist(sql, helper); 2)ListParameterHelper の利用 ListParameterHelper の場合は helper.addparameter でパラメータを追加する順番が SQL 文に 書かれたパラメータの順番通りでないといけないことに注目してください ODBC のようにバインド変数が? の場合に利用してください SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = @"SELECT * FROM PERSON WHERE WEIGHT_KG >= @WEIGHT_KG AND HEIGHT_M >= @HEIGHT_M "; ListParameterHelper helper = new ListParameterHelper (); helper.addparameter(80.0m); helper.addparameter(165.5m); IList list = executer.executequeryforlist(sql, helper); 21

6-8. その他の検索系 SQL 実行メソッド DBee2 では さまざまな検索結果オブジェクトを返すメソッドを用意しています 1) ExecuteQueryForMap の利用 SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = "SELECT * FROM PERSON WHERE ID = @ID "; DictionaryParameterHelper helper = new DictionaryParameterHelper(); helper.addparameter("id", userid); IDictionary map = executer. ExecuteQueryForMap(sql, helper); String firstname = map["first_name"] as string; 単一の IDictionary に検索結果を格納し戻します データにアクセスするには 列名をキーにハッシュか ら値を取得します 2) ExecuteQueryForList の利用 SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = "SELECT * FROM PERSON "; IList list = executer. ExecuteQueryForList(sql, null); foreach (IDictionary map in list) 第三パラメータに DTO クラスを指定しない場合 ExecuteQueryForList は検索結果を格納した IDictionary のコレクションを戻します 3) ExecuteQueryForDataTable の利用 public DataTable GetAllParson() SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = "SELECT * FROM PERSON "; return executer. ExecuteQueryForDataTable (sql, null); 22

4) ExecuteQueryForObject の利用 public int CountParson() SimpleSqlExecuter executer = new SimpleSqlExecuter(); string sql = "SELECT COUNT(*) FROM PERSON "; return Convert.ToInt32(executer. ExecuteQueryForObject(sql, null)); 以上が SimpleSqlExecuter のメソッドを利用した検索系のサンプルとなります サンプルコードを見てお分かりかと思いますが コネクションを意識せず単純なコーディングを行えばよいということに注目してください SQL 文さえ完成してしまえば ほとんどのケースでカット & ペーストだけでコーディングが済んでしまうでしょう 6-9. DynamicDto の利用 DynamicDto を利用した場合 静的な DTO クラスの作成は必要ありません DB のテーブル名で動的に生成された DTO クラスを利用することが出来ます 以下は DynamicSqlExecuter クラスを利用して検索を行うサンプルです DynamicSqlExecuter executer = new DynamicSqlExecuter(); string sql = "SELECT * FROM PERSON WHERE AGE = @AGE"; DynamicDtoParameterHelper helper = new DynamicDtoParameterHelper( PERSON ); helper.addparameter( AGE, 25); IList list = executer. ExecuteQueryForList(sql, helper, PERSON ); foreach (object obj in list) DynamicValueHandler handler = new DynamicValueHandler(obj); object val1 = handler.getvalue( PEKE ); string val2 = handler.getvalueforstring( NAME ); int val3 = handler.getvalueforint( AGE ); DateTime val4 = handler.getvaluefordatetime( BIRTHDAY ); 23

8. チュートリアル ( 更新系 ) 続いて更新系のメソッドを利用するサンプルを紹介していきます 更新系は結果を格納するオブジェクト概念がないので 更に単純なコードになります また SQL 文にバインドするパラメータの概念は検索系とまったく同じものなので ここでの説明は割愛します 7-1. データの挿入サンプル 以下は PERSON テーブルにデータを挿入するメソッドのサンプルです メソッドのパラメータ Person クラスに 設定されているデータをデータベースに挿入します Public void UpdatePerson(Person person) SimpleSqlExecuter executer = new SimpleSqlExecuert(); string sql = "INSERT INTO PERSON " + "(ID, FIRST_NAME, LAST_NAME, BIRTH_DATE, WEIGHT_KG, HEIGHT_M) " + "VALUES " + "(@ID, @FIRST_NAME, @LAST_NAME, @BIRTH_DATE, @WEIGHT_KG, @HEIGHT_M) "; executer. ExecuteInsert(sql, person); 7-2. データの更新サンプル 以下は PERSON テーブルのデータを更新するメソッドのサンプルです メソッドのパラメータ Person クラスに 設定されている ID をキーに WEIGHT_KG と HEIGHT_M 列を更新しています Public void UpdatePerson(Person person) SimpleSqlExecuter executer = new SimpleSqlExecuert(); string sql = "UPDATE PERSON SET " + "WEIGHT_KG = @WEIGHT_KG, " + "HEIGHT_M = @HEIGHT_M " + "WHERE ID = @ID "; executer. ExecuteUpdate(sql, person); 24

7-3. データの削除サンプル 以下は PERSON テーブルのデータを削除するメソッドのサンプルです メソッドのパラメータ Person クラスに 設定されている ID をキーにレコードを削除しています Public void UpdatePerson(Person person) SimpleSqlExecuter executer = new SimpleSqlExecuert(); string sql = "DELETE FROM PERSON " + "WHERE ID = @ID "; executer. ExecuteDelete(sql, person); 7-4. 少し凝った更新サンプル 更新系のサンプルはあまり面白くないので 以下にちょっとした TIPS 的なサンプルを示します テーブルにデ ータがすでに存在すれば更新 なければ挿入という更新系メソッドが実行件数を戻すのを利用した更新 サンプルになります Public void UpdatePerson(Person person) SimpleSqlExecuter executer = new SimpleSqlExecuert(); string update = "UPDATE PERSON SET " + "WEIGHT_KG = @WEIGHT_KG, " + "HEIGHT_M = @HEIGHT_M " + "WHERE ID = @ID "; string insert = "INSERT INTO PERSON " + "(ID, FIRST_NAME, LAST_NAME, BIRTH_DATE, WEIGHT_KG, HEIGHT_M) " + "VALUES " + "(@ID, @FIRST_NAME, @LAST_NAME, @BIRTH_DATE, @WEIGHT_KG, @HEIGHT_M) "; if (executer. ExecuteUpdate(update, person) == 0) executer. ExecuteInsert(insert, person); 25

7-5. トランザクションを明示的に行う DBee2 では トランザクションを明示的に行うことも可能です 実装も非常に簡単で以下にそのサンプルを 示します Public void DeleteAndInsertPerson(Person person) using (ITransactionSupport tx = new LocalTxRequired()) try SimpleSqlExecuter executer = new SimpleSqlExecuert(); executer. ExecuteUpdate(update, person); executer. ExecuteDelete(update, person); executer. ExecuteInsert(update, person); tx.commit(); Catch (Exception ex) Throw ex; LocalTxRequired クラスは ローカルトランザクション管理のクラスです このクラスを using 句で利用すれば トランザクション開始中にスコープから外れると自動的にロールバックを実行します ですので 上記のように 例外をハンドルすれば エラーの際には自動的にロールバックが行われます LocalTxRequired と LocalTxRequiredNew はデフォルトでは System.Data.IsolationLevel.ReadCommitted(ISO レベル ) で動作します コンストラクタの引数で ISO レベルを 指定することも可能です 26

9. チュートリアル ( プロシージャ系 ) 最後にプロシージャを実行するためのサンプルを以下に示します 基本的には検索系と同じパターンですが パラメータに IN/OUT 概念があることと OUT パラメータの値の取得方法が特殊であることに注目してください SimpleSqlExecuter executer = new SimpleSqlExecuert(); string sql = "TestProcedure"; // プロシージャの実行には必ず ProcedureParameterHelper を利用します // パラメータの存在しないプロシージャであれば必須ではありません ProcedureParameterHelper handler = new ProcedureParameterHelper(); //IN パラメータを設定します SqlServer の場合パラメータの @ は自動で付加しますので //@ をはずしたパラメータ名を指定してください // パラメータの型は意識しないで構いません helper.addparameter("job_in", "MANAGER", ParameterDirection.Input); //OUT パラメータを設定します // パラメータは IN の場合と同様です // 値はセットする必要がないのですが Null をバインドできないので //ProcedureParameterHelper.EMPTY_STRING または //ProcedureParameterHelper.EMPTY_INT を // 利用してください helper.addparameter("hitcount_out", ProcedureParameterHelper.EMPTY_INT, ParameterDirection.Output); //ReturnValue を設定します このパラメータ名は何でも構いません helper.addparameter("retvalue", ProcedureParameterHelper.EMPTY_INT, ParameterDirection.ReturnValue); // リザルトセットのハンドラーは SelectWapper と同様に利用できます DataTable dtable = executer.executeprocedurefordatatable( sql, helper); DataGridView1.DataSource = dtable; //OUT パラメータの実行結果は ProcedureParameterHelper へ戻します //GetOutParameterMap() メソッドを利用してもらえば OUT パラメータの // 連想配列を取得できます //GetOutValue(object key) メソッドでは OUT パラメータをキーとした //Value を取得できます foreach (object key in helper.getoutparametermap().keys) System.Console.Out.WriteLine(" プロシージャ実行結果 0:1", key, GetOutParameterMap()[key]); 27

8-1. ParameterDirection ParameterDirection は プロシージャへのパラメータの IN/OUT を指定します 8-2. OUT パラメータにおける注意点 PUT パラメータの値ならびリターンバリューの値は ProceduerParameterHelper に格納されます 値の取得は GetOutValue(" パラメータ名 ) または GetOutParameterMap() メソッドで取得することができます addparameter() メソッドでは 自動で DB のパラメータにバインドしますので あらかじめ空のオブジェクトを値として設定する必要があります DB の型に対応するクラスが必要です もし プロシージャの OUT の型が数値型であれば ProceduerParameterHelper.EMPTY_INT を指定してみください もし プロシージャの OUT の型が文字列型であれば ProceduerParameterHelper.EMPTY_STRING を指定してみください また 文字列型の場合は DB によってはあらかじめ桁数分の文字列バッファが必要な場合がありますのでその場合は ProceduerParameterHelper.GetBlankString(OUT パラメータの桁数 ) を利用してみてください 28

10. 設定ファイルの暗号化 DBee2 では 設定ファイルのコネクションストリング部分にデータベースのユーザー パスワードを記載します セキュリティの厳しい昨今ではあまり好ましいことではありません そこで コネクションストリング部分の暗号化に対応しています 設定ファイルの iscrypt を false に設定してある場合 DBee2 はデバッグレベルでログにコネクションストリング部分の暗号化文字列を出力します その暗号化文字列とコネクションストリング部分を置き換え iscrypt を true にすれば暗号化の設定は完了です 11. 複数データベースの接続 DBee2 は 複数のデータベースへの接続に対応しています 操作するデータベースを切り替えるには DbeeContext.SetCurrentTrailer(" 設定ファイルの dbname"); を実行してください ただし 以下の利用方法はサポートしていません 複数データベースをまたがるトランザクション マルチスレッドによる複数データベースへの同時接続 29