開発Blog

データベースの登録、更新、削除メソッドをカスタマイズする

投稿日:


※下記内容は、過去のintra-mart(Ver4.3以前)に関する内容です。
最新のintra-martでは、異なる情報であることがありますので、ご注意ください。


データベースを操作するプログラムを作る際に意外と知られていないのが、フレームワークの API,Module.databaseを使ったときにどのようなSQLが実際作られているのかという点です。 Module.database.selectの場合は直接SELECT文を引数に渡すので気にならないのですが、Module.databaseオブ ジェクトの、insert,update,removeメソッドの場合はどうでしょう?Module.databaseオブジェクトの、 insert,update,removeメソッドによって生成されるSQL文を変更する方法を記述します。

以下、Module.database.insertメソッドを例に説明をしていきますが、update,removeメソッドについても同様です。まず、何もカスタマイズしていない状態での動作について説明します。

Module.database.insertメソッドが実行されるとInformationサーバ/unit/library /im_default_sql.js ファイルに記述されているgetSqlForDatabaseInsert関数が呼び出されます。
この関数が、実際にSQL文を生成している部分になります。
(このような関数を、以下、SQL生成ロジックと呼びます。)
ここで作成されたSQL文が、そのままデータベースへ渡されます。

例)//ファンクションコンテナ内
var objIns = new Object();
objIns.clm_1 = "カラム1";
Module.database.insert("test_tbl",objIns,"DEFAULT");*** DBへ渡されるSQL文 ***
insert into test_tbl (clm_1) values('カラム1')

このgetSqlForDatabaseInsert関数は、以下の手順でシステムに登録されています。

1.Applicationサーバの起動
2.Informationサーバ/init.jsの実行
3.Informationサーバ/unit/library/init.jsの実行
4.Informationサーバ/unit/library/im_default_sql.jsの読み込み
5.Informationサーバ/unit/library/im_default_sql.jsファイルの先頭に記述してある

Module.database.setInsertSQLメソッドにより、同ファイル内のgetSqlForDatabaseInsert関数がシステ ムに登録される。
(Module.database.setInsertSQLメソッドについてはAPIリストを参照して下さい。) 
データベースや、そのデータベースでのデータ型によっては、デフォルトで生成されるSQL文ではまずい場合もあります。そのときは、以下の方法でデフォル トの動作を変更することができます。

1)Informationサーバ/unit/library/im_default_sql.jsファイルを直接編集する方法Information サーバ/unit/library/im_default_sql.jsファイルのgetSqlForDatabaseInsert関数を直接編集して下 さい。その際、引数と戻り値は変更することはできません。
編集後、Applicationサーバの再起動が必要です。 

2)自作の関数を登録する方法
Informationサーバ/unit/library/im_default_sql.jsファイルを参考に、新しくファイルを作成して下さい。 Module.database.setInsertSQLメソッドは、Module.database.setInsertSQLメソッドが記述されて いるファイルと同じファイル中にある関数しか登録できませんので、必ずModule.database.setInsertSQLメソッド
とSQL生成ロジックは同じファイルに記述して下さい。
出来上がったファイルは、includeメソッドを利用して読み込んで下さい。
読み込む場所、タイミングに制約はありません。(Informationサーバ/init.jsにincludeメソッドを追記して Applicationサーバ起動時に読み込むようにしなければならないということはありません。)

例)
//SQL生成ロジックの登録
Module.database.setInsertSQL(getSqlForDatabaseInsert);//SQL生成ロジック定義
function getSqlForDatabaseInsert{
}SQL生成ロジックの引数は、Module.database.insertメソッドに渡された引数がそのまま渡されます。
※SQL生成ロジックの引数
//=============================================================================
// データベース更新アクセス INSERT 文構築関数
// 【 入力 】sTable: 挿入表名
// oValue: 挿入データ(オブジェクト)
// sName : 接続参照名称
// 【返却値】INSERT 文(文字列)
// 【 備考 】第2引数はオブジェクト形式です。
// プロパティ名 = カラム名
// そのプロパティ名の中のデータが挿入データになっています。
//=============================================================================
function getSqlForDatabaseInsert(sTable, oValue, sName) {SQL文生成処理return SQL文
} 
注意点
・SQL生成ロジック中でDebug.browseメソッドを使用することはできません。デバッグには、Debug.printメソッドなどを使用して下 さい。
・SQL生成ロジックの引数と戻り値は変更することはできません。 
また、接続するデータベースごとにSQL生成ロジックを変更することも可能です。

1)SQL生成ロジックの引数を利用する方法
SQL生成ロジックの最後の引数にDB接続参照名が渡されるので、SQL生成ロジック内で、DB接続参照名ごとに処理を分岐させることができます。

2)Module.database.setInsertSQLメソッドを利用する方法
SQL生成ロジックを登録する際、Module.database.setInsertSQLメソッドの第二引数にDB接続参照名を指定しておくと、指定 したDB接続参照名を持つDBに対してModule.database.insertメソッドを発行したとき、そのSQL生成ロジックが実行されます。 
実際に生成されたSQL文の確認方法としては、Applicationサーバの設定ファイルimart.iniでデータベースログ出力を ON(LOG_DATABASE=ON)にすると、データベースログファイルに、実際に出力された
SQL文が書き込まれますので、それによって確認することができます。

-開発Blog
-

執筆者:

関連記事

no image

Win7(64bit)上で e Builder Ver.7.2 を使用するには…

Windows 7 (64bit) 上で e Builder Ver.7.2 を使用するには現状、 「-d32オプションをeclipse.iniのvmargsに追加する」 方法しかございません。。 [ …

no image

SVF(SuperVisualFormade)とintra-martの連携について

※下記内容は、過去のintra-mart(Ver4.3以前)に関する内容です。最新のintra-martでは、異なる情報であることがありますので、ご注意ください。 最近、SuperVisualForm …

no image

最近のトラブル事例から - Oracle11でDATE型が正しく表示できない –

毎年、4月になると、年度末で開発を終えたシステムが運用を開始して、さまざまなお問い合わせがくる季節で、今年も、例年と同じく、さまざまなご相談を弊社サポートサイトを中心に対応させていただきました。そこで …

no image

Webアプリケーションサーバ情報取得ツール intra-mart Server-eye

Server-eye とは? Web application serverの情報を、ネットワークを介して手元のブラウザで見ることができます。ブラウザの画面はHTML5およびAjax(JavaScrip …

no image

SQL Serverの利用時に遅いクエリを特定する方法

SQL Serverの利用中にレスポンス遅延が発生した場合、どのクエリがボトルネックになっているか簡単に確認する方法をご紹介します。レスポンス遅延発生時の切り分けなどにご利用ください。 概要 SQL …

まだデータがありません。

RSSRSSRSSRSS