    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.report;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.fukurou.db.ConnectionFactory;
    021import org.opengion.fukurou.db.DBUtil;                                  // 5.5.5.1 (2012/08/07)
    022import org.opengion.fukurou.util.StringUtil;
    023import org.opengion.fukurou.util.FileUtil;
    024import org.opengion.fukurou.util.ApplicationInfo;
    025import org.opengion.fukurou.util.Closer;
    026
    027import java.io.File;
    028import java.io.IOException;
    029import java.util.List;
    030import java.util.Arrays;
    031
    032import java.sql.Connection;
    033import java.sql.PreparedStatement;
    034import java.sql.SQLException;
    035
    036/**
    037 * 【EXCEL取込】雛形EXCELシートと、データEXCELシートから、指定のDBにデータを登録するクラスクラスです。
    038 * 雛形EXCELシートは、{&#064;カラム} で記述されており、このカラムのEXCEL上のセルの位置を元に、
    039 * データEXCELシートから所定のデータを読みこみ、雛形明細定義(GE57)で指定のテーブルに
    040 * 抜き出したデータを登録します。
    041 * 雛形明細定義(GE57)では、システムID+帳票ID+シート番号をキーに、読み取る対応シートや
    042 * シート毎にヘッダーテーブル、明細テーブルの指定、繰返必須カラムのしていなどにより、
    043 * 読取る方式と、書き込むテーブルを指定します。
    044 *
    045 * @og.rev 3.8.0.0 (2005/06/07) 新規追加
    046 * @og.group 帳票システム
    047 *
    048 * @version  4.0
    049 * @author   Kazuhiko Hasegawa
    050 * @since    JDK5.0,
    051 */
    052public class ExcelInsert {
    053        private static final String CR = HybsSystem.CR ;
    054
    055        private final StringBuilder errMsg ;
    056
    057        // DBTableReport に対して設定する情報
    058        private final String EXCELIN ;          // EXCEL ファイルの取込DIR ファイル名は、要求番号.xls
    059
    060        // 受け渡し変数
    061        private final String    SYSTEM_ID       ;
    062        private final String    YKNO            ;
    063        private final String    LISTID          ;
    064        private final boolean   DEBUG           ;       // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加
    065
    066        // GE54,GE57 帳票定義、明細情報
    067        private String          MODELDIR        = null;         // GE54 雛形EXCELディレクトリ
    068        private String          MODELFILE       = null;         // GE54 雛形EXCELファイル名
    069        private String[]        SHEETNO         = null;         // GE57 雛形EXCELシート番号
    070        private String[]        SHEETREF        = null;         // GE57 データEXCELシート番号
    071        private String[]        HEADDBID        = null;         // GE57 ヘッダーテーブル
    072        private String[]        BODYDBID        = null;         // GE57 明細テーブル
    073        private String[]        LOOPCLM         = null;         // GE57 繰返必須カラム名
    074
    075        private ExcelLayout layout = null;
    076
    077        // GE54,GE57 の帳票定義情報を取得するSQL文です。
    078        private static final String GE54_GE57_SELECT =
    079                "SELECT A.MODELDIR,A.MODELFILE,B.SHEETNO,B.SHEETREF,B.HEADDBID,B.BODYDBID,B.LOOPCLM" +
    080                " FROM GE54 A INNER JOIN GE57 B" +
    081                " ON   A.SYSTEM_ID = B.SYSTEM_ID AND A.LISTID = B.LISTID" +
    082                " WHERE A.FGJ = '1' AND B.FGJ = '1'" +
    083                " AND  A.SYSTEM_ID = ?" +
    084                " AND  A.LISTID = ?" +
    085                " ORDER BY B.SHEETNO" ;
    086
    087        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    088        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    089
    090        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    091        private final ApplicationInfo appInfo;
    092        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
    093
    094        /**
    095         * コンストラクター
    096         * 引数を受けとって、インスタンスを作成します。
    097         *
    098         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    099         *
    100         * @param system_id システムID
    101         * @param ykno 要求番号
    102         * @param listId 帳票ID
    103         * @param excelinDir 出力ディレクトリ
    104         * @param debug デバッグフラグ
    105         */
    106        public ExcelInsert( final String system_id, final String ykno, final String listId, final String excelinDir, final boolean debug ) {
    107                SYSTEM_ID = system_id;
    108                YKNO      = ykno;
    109                LISTID    = listId;
    110                EXCELIN   = excelinDir;
    111                DEBUG     = debug;
    112                errMsg    = new StringBuilder();
    113
    114                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    115                if( USE_DB_APPLICATION_INFO ) {
    116                        appInfo = new ApplicationInfo();
    117                        // ユーザーID,IPアドレス,ホスト名
    118                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    119                        // 画面ID,操作,プログラムID
    120                        appInfo.setModuleInfo( "ExcelInsert",YKNO,LISTID );
    121                }
    122                else {
    123                        appInfo = null;
    124                }
    125        }
    126
    127        /**
    128         * 変換処理を実行します。
    129         *
    130         * @og.rev 3.8.0.9 (2005/10/17) エラーメッセージ強化
    131         *
    132         * @return 結果 [true:正常/false:異常]
    133         */
    134        public boolean execute() {
    135                System.out.print( "ExcelInsert Started ... " );
    136                boolean flag ;
    137
    138                try {
    139                        // 初期化 GE54,GE57 帳票定義マスタより必要な情報を取得します。
    140                        flag = initialDataSet();
    141                        if( flag ) { System.out.print( "INIT," ); }
    142
    143                        // 雛型ファイルの存在チェックを行います。
    144                        // 3.5.4.9 (2004/02/25) 存在チェックエラー(原因不明)の暫定対応
    145                        File templateExcel = null;
    146                        if( flag ) {
    147                                templateExcel = FileUtil.checkFile( MODELDIR, MODELFILE + ".xls" );
    148                                flag = ( templateExcel != null ) ;              // チェックの結果が null なら、見つからなかった。
    149                                // 3.8.0.9 (2005/10/17) エラーメッセージ強化
    150                                if( flag ) { System.out.print( "MDL IN," ); }
    151                                else {
    152                                        errMsg.append( "ExcelInsert MODELFILE Not Found Error!" ).append( CR );
    153                                        errMsg.append( "==============================" ).append( CR );
    154                                        errMsg.append( "MODELDIR=" ).append( MODELDIR ).append( CR ) ;
    155                                        errMsg.append( "MODELFILE=" ).append( MODELFILE ).append( ".xls" ) ;
    156                                        errMsg.append( CR ) ;
    157                                }
    158                        }
    159
    160                        // EXCELデータファイルの存在チェックを行います。
    161                        File inputExcel = null;
    162                        if( flag ) {
    163                                inputExcel = FileUtil.checkFile( EXCELIN, YKNO + ".xls" );
    164                                flag = ( inputExcel != null ) ;         // チェックの結果が null なら、見つからなかった。
    165                                // 3.8.0.9 (2005/10/17) エラーメッセージ強化
    166                                if( flag ) { System.out.print( "XLS IN," ); }
    167                                else {
    168                                        errMsg.append( "ExcelInsert EXCELIN Not Found Error!" ).append( CR );
    169                                        errMsg.append( "==============================" ).append( CR );
    170                                        errMsg.append( "DIR=" ).append( EXCELIN ).append( CR ) ;
    171                                        errMsg.append( "FILE=" ).append( YKNO ).append( ".xls" ) ;
    172                                        errMsg.append( CR ) ;
    173                                }
    174                        }
    175
    176                        // 雛形ファイルより、処理対象行列を読み取ります。
    177                        if( flag ) {
    178                                flag = getModelData( templateExcel );
    179                                if( flag ) { System.out.print( "MDL DT," ); }
    180                        }
    181
    182                        // EXCELデータファイルを読取り、データベースに書き込みます。
    183                        if( flag ) {
    184                                flag = readAndInsertDB( inputExcel );
    185                                if( flag ) { System.out.print( "IN DB," ); }
    186                        }
    187                }
    188                catch ( RuntimeException ex ) {
    189                        errMsg.append( "ExcelInsert Execute Exception Error!" ).append( CR );
    190                        errMsg.append( "==============================" ).append( CR );
    191                        errMsg.append( StringUtil.stringStackTrace( ex ) ) ;
    192                        errMsg.append( CR ) ;
    193                        flag = false;
    194                }
    195
    196                System.out.println( "End." );
    197                return flag ;
    198        }
    199
    200        /**
    201         * 初期データセットを行います。
    202         * ここでは、GE54,GE57 テーブルより必要な情報を取得します。
    203         *
    204         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    205         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
    206         *
    207         * @return 結果 [true:正常/false:異常]
    208         */
    209        private boolean initialDataSet() {
    210                String[] args = new String[] { SYSTEM_ID,LISTID };
    211                // A.MODELDIR,A.MODELFILE,B.SHEETNO,B.SHEETREF,B.HEADDBID,B.BODYDBID,B.LOOPCLM
    212//              String[][] vals = org.opengion.fukurou.db.DBUtil.dbExecute( GE54_GE57_SELECT,args,appInfo );    // 3.8.7.0 (2006/12/15)
    213                String[][] vals = DBUtil.dbExecute( GE54_GE57_SELECT,args,appInfo, DBID );      // 3.8.7.0 (2006/12/15)
    214                if( vals == null || vals.length == 0 ) {
    215                        errMsg.append( "Data does not exist in GE54 table." ).append( CR );
    216                        errMsg.append( "==============================" ).append( CR );
    217                        errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " );
    218                        errMsg.append( "LISTID=["    ).append( LISTID    ).append( "]" );
    219                        errMsg.append( CR );
    220                        return false;
    221                }
    222
    223                int maxRow = vals.length;               // 先の条件判断で、最低 1 件以上存在する。
    224                MODELDIR        = StringUtil.nval( vals[0][0],MODELDIR   );
    225                MODELFILE       = StringUtil.nval( vals[0][1],MODELFILE  );
    226
    227                if( MODELDIR  == null || MODELDIR.length()  == 0 ||
    228                        MODELFILE == null || MODELFILE.length() == 0 ) {
    229                        errMsg.append( "MODELDIR and MODELFILE is necessary in GE54 table." ).append( CR );
    230                        errMsg.append( "==============================" ).append( CR );
    231                        errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " );
    232                        errMsg.append( "LISTID=["    ).append( LISTID    ).append( "] , " );
    233                        errMsg.append( "MODELDIR=["  ).append( MODELDIR  ).append( "] , " );
    234                        errMsg.append( "MODELFILE=[" ).append( MODELFILE ).append( "] " );
    235                        errMsg.append( CR );
    236                        return false;
    237                }
    238
    239                SHEETNO         = new String[maxRow];
    240                SHEETREF        = new String[maxRow];
    241                HEADDBID        = new String[maxRow];
    242                BODYDBID        = new String[maxRow];
    243                LOOPCLM         = new String[maxRow];
    244
    245                for( int row=0; row<maxRow; row++ ) {
    246                        SHEETNO[row]    = StringUtil.nval( vals[row][2],null );
    247                        SHEETREF[row]   = StringUtil.nval( vals[row][3],null );
    248                        HEADDBID[row]   = StringUtil.nval( vals[row][4],null );
    249                        BODYDBID[row]   = StringUtil.nval( vals[row][5],null );
    250                        LOOPCLM[row]    = StringUtil.nval( vals[row][6],null );
    251
    252                        // SHEETNO と SHEETREF は、どちら『も』必須
    253                        // HEADDBID と BODYDBID は、どちら『か』必須
    254                        if( SHEETNO[row] == null || SHEETREF[row] == null ||
    255                                ( HEADDBID[row] == null && BODYDBID[row] == null ) ) {
    256                                errMsg.append( "SHEETNO と SHEETREF は、どちら『も』必須" ).append( CR );
    257                                errMsg.append( "HEADDBID と BODYDBID は、どちら『か』必須" ).append( CR );
    258                                errMsg.append( "==============================" ).append( CR );
    259                                errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID     ).append( "] , " );
    260                                errMsg.append( "LISTID=["    ).append( LISTID        ).append( "] , " );
    261                                errMsg.append( "SHEETNO=["   ).append( SHEETNO[row]  ).append( "] , " );
    262                                errMsg.append( "SHEETREF=["  ).append( SHEETREF[row] ).append( "] , " );
    263                                errMsg.append( "HEADDBID=["  ).append( HEADDBID[row] ).append( "] , " );
    264                                errMsg.append( "BODYDBID=["  ).append( BODYDBID[row] ).append( "] " );
    265                                errMsg.append( CR );
    266                                return false;
    267                        }
    268                }
    269
    270                return true;
    271        }
    272
    273        /**
    274         * 雛形ファイルより、対象行列を読み取ります。
    275         *
    276         * @param       file    雛形ファイル
    277         *
    278         * @return 結果 [true:正常/false:異常]
    279         */
    280        private boolean getModelData( final File file ) {
    281                try {
    282                        layout = HybsHSSFListener.makeExcelLayout( file,false );
    283                }
    284                catch( IOException ex ) {
    285                        errMsg.append( "Template Excel File can not ModelData." ).append( CR );
    286                        errMsg.append( "==============================" ).append( CR );
    287                        errMsg.append( "File=" ).append( file.getAbsolutePath() );
    288                        errMsg.append( StringUtil.stringStackTrace( ex ) );
    289                        errMsg.append( CR );
    290                        return false;
    291                }
    292
    293                return true;
    294        }
    295
    296        /**
    297         * EXCELを読取り、データベースに書き込みます。
    298         *
    299         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    300         *
    301         * @param       file    EXCELファイル
    302         *
    303         * @return 結果 [true:正常/false:異常]
    304         */
    305        private boolean readAndInsertDB( final File file ) {
    306
    307                ExcelDataPickup pickup = new ExcelDataPickup( layout,file,DEBUG );
    308
    309                // 実際のデータシートの枚数
    310                int sheetSize = pickup.getSheetSize();
    311                // SHEETREF に対して、実際に割り当てなおしたシート対応
    312                int[] reference = makeSheetReference( sheetSize,SHEETREF );
    313
    314                DatabaseExecute exec = new DatabaseExecute();
    315                exec.setApplicationInfo( appInfo );             // 3.8.7.0 (2006/12/15)
    316                int ykno = Integer.parseInt(YKNO) ;
    317                for( int shNo=0; shNo<sheetSize; shNo++ ) {
    318                        int ref = reference[shNo];
    319                        if( ref < 0 ) { continue; }  // 処理対象外
    320
    321                        pickup.execute( Integer.parseInt( SHEETNO[ref] ),shNo,LOOPCLM[ref] ) ;
    322
    323                        String headerQuery = layout.getHeaderInsertQuery( HEADDBID[ref] );
    324                        if( headerQuery != null ) {
    325                                exec.setStatement( headerQuery );
    326
    327                                String[] headerData = layout.getHeaderInsertData( SYSTEM_ID,ykno,shNo );
    328                                exec.dbExecute( headerData );
    329                        }
    330
    331                        String bodyQuery = layout.getBodyInsertQuery( BODYDBID[ref] );
    332                        if( bodyQuery != null ) {
    333                                exec.setStatement( bodyQuery );
    334
    335                                List<String[]> bodyData  = layout.getBodyInsertData( SYSTEM_ID,ykno,shNo );
    336                                for( int j=0; j<bodyData.size(); j++ ) {
    337//                                      exec.dbExecute( (String[])bodyData.get(j) );
    338                                        exec.dbExecute( bodyData.get(j) );
    339                                }
    340                        }
    341                }
    342                exec.commit();
    343                pickup.close();
    344
    345                return true;
    346        }
    347
    348        /**
    349         * GE57 に指定のSHEETNOとSHEETREF配列より、実際にアクセスするシート番号に対応したリファレンス配列を求めます。
    350         * SHEETNO は、雛形EXCELの使用するシート番号を指定します。SHEETREFは、その雛形シートを
    351         * 利用して処理するデータEXCELのシートを指定します。シート番号は、０から始まります。
    352         * この、データEXCELシート(SHEETREF)は、単一数、カンマ結合、LAST文字 で指定します。
    353         * 単一数：雛形シートと１対１で対応するデータEXCELシート番号
    354         * カンマ結合：3,4,5 や、2,5 などの複数シートをひとつの雛形シートで処理する場合に設定します。
    355         * LAST文字：5,LAST や LAST と記述することで、それ以降の全データシートを雛形シートで処理します。
    356         *
    357         * ここでは、SHEETREF配列 を実際のデータEXCELシート数分の配列に再配置し、その元のアドレスを
    358         * 指すリファレンス情報を返します。
    359         * このリファレンス情報を元に、SHEETNO,HEADDBID,BODYDBID,LOOPCLM などの元の配列にアクセスし、
    360         * 設定値を取得してきます。
    361         *
    362         * 例)
    363         *  SHEETNO  = { "1","2"  ,"3","4"  ,"6" };
    364         *  SHEETREF = { "1","2,6","4","5,3","8,LAST" };
    365         *  HEADDBID = { "A","B"  ,"C","D"  ,"E" };
    366         *  データシート数=11
    367         *
    368         * i=[0]  , No=[1], REF=[1]
    369         * i=[1]  , No=[2], REF=[2,6]
    370         * i=[2]  , No=[3], REF=[4]
    371         * i=[3]  , No=[4], REF=[5,3]
    372         * i=[4]  , No=[6], REF=[8,LAST]
    373         * =========================
    374         * REF=[0]  , Ref=[-1], SHEETNO[]   = -  , HEADDBID[]   = -
    375         * REF=[1]  , Ref=[0],  SHEETNO[[0]]=[1] , HEADDBID[[0]]=[A]
    376         * REF=[2]  , Ref=[1],  SHEETNO[[1]]=[2] , HEADDBID[[1]]=[B]
    377         * REF=[3]  , Ref=[3],  SHEETNO[[3]]=[4] , HEADDBID[[3]]=[D]
    378         * REF=[4]  , Ref=[2],  SHEETNO[[2]]=[3] , HEADDBID[[2]]=[C]
    379         * REF=[5]  , Ref=[3],  SHEETNO[[3]]=[4] , HEADDBID[[3]]=[D]
    380         * REF=[6]  , Ref=[1],  SHEETNO[[1]]=[2] , HEADDBID[[1]]=[B]
    381         * REF=[7]  , Ref=[-1], SHEETNO[]   = -  , HEADDBID[]   = -
    382         * REF=[8]  , Ref=[4],  SHEETNO[[4]]=[6] , HEADDBID[[4]]=[E]
    383         * REF=[9]  , Ref=[4],  SHEETNO[[4]]=[6] , HEADDBID[[4]]=[E]
    384         * REF=[10] , Ref=[4],  SHEETNO[[4]]=[6] , HEADDBID[[4]]=[E]
    385         *
    386         * @param       size    データシートの総件数
    387         * @param       sheetRef        データEXCELシートの対応する配列(単一数、カンマ結合、LAST文字 が使用可能)
    388         *
    389         * @return      データ件数分に再配置した、雛形EXCELシート番号配列。使用しない場合は、-1 がセット。
    390         */
    391        private int[] makeSheetReference( final int size,final String[] sheetRef ) {
    392
    393                int[] reference = new int[size];
    394                Arrays.fill( reference ,-1 );
    395
    396                int maxNo = -1;
    397                for( int i=0; i<sheetRef.length; i++ ) {
    398                        String[] temp = StringUtil.csv2Array( sheetRef[i] );
    399                        for( int j=0; j<temp.length; j++ ) {
    400                                if( temp[j].equals( "LAST" ) ) {
    401                                        for( int k=maxNo; k<size; k++ ) {
    402                                                reference[k]  = i ;
    403                                        }
    404                                        i=size;
    405                                        break;
    406                                }
    407                                else {
    408                                        int no = Integer.parseInt(temp[j]) ;
    409                                        if( no < size ) {
    410                                                reference[no]  = i ;
    411                                                if( maxNo < no ) { maxNo = no+1; }
    412                                        }
    413                                        else {
    414                                                String errMsg = "データシートと雛形明細定義の対応ができません。"
    415                                                                + " データシート総件数=[" + size + "] "
    416                                                                + " sheetRef[" + i + "]=" + sheetRef[i] ;
    417                                                throw new HybsSystemException( errMsg );
    418                                        }
    419                                }
    420                        }
    421                }
    422                return reference ;
    423        }
    424
    425        /**
    426         * エラーが存在した場合に、エラーメッセージを返します。
    427         *
    428         * @return エラーメッセージ String
    429         */
    430        public String getErrMsg() {
    431                return errMsg.toString();
    432        }
    433}
    434
    435/**
    436 * 連続した データベース処理を行う為の、管理処理クラスです。
    437 * ExcelInsert でのコーディングを分けるためだけのクラスです。
    438 *
    439 * オブジェクト作成時に、DEFAULT 接続を内部にキープし、setStatement( String )で
    440 * PreparedStatementオブジェクトを作成します。このメソッドを呼ぶまでは、
    441 * 同じ PreparedStatementオブジェクトを使い続けます。
    442 * dbExecute( String[] ) メソッドで、PreparedStatement に設定する引数配列をセットします。
    443 * この段階では、commit も、PreparedStatementのclose も行いませんので、連続して、
    444 * dbExecute( String[] ) メソッドを呼び出すことが可能です。
    445 * 最後に、commit() で、Connection は、プールに返されます。
    446 *
    447 * エラー時は、rollback() して、Connection は、破棄されます。
    448 *
    449 * @og.group 帳票システム
    450 *
    451 * @version  4.0
    452 * @author   Kazuhiko Hasegawa
    453 * @since    JDK5.0,
    454 */
    455class DatabaseExecute {
    456        // 4.0.0.0 (2007/10/10) dbid の初期値を、"DEFAULT" から null に変更
    457//      private static final String connID = "DEFAULT" ;
    458        private static final String DBID = null ;
    459
    460        private Connection conn = null;
    461        private PreparedStatement pstmt = null;
    462        private String   tempSql  = null;       // エラー時にSQL文を表示させる場合に使用します。
    463        private ApplicationInfo appInfo = null;
    464
    465        /**
    466         * アクセスログ取得の為,ApplicationInfoオブジェクトを設定します。
    467         *
    468         * @og.rev 3.8.7.0 (2006/12/15) 新規追加
    469         *
    470         * @param   appInfo ApplicationInfo
    471         */
    472        public void setApplicationInfo( final ApplicationInfo appInfo ) {
    473                this.appInfo = appInfo;
    474        }
    475
    476        /**
    477         * PreparedStatementオブジェクトを作成します。
    478         * 次に、このメソッドを呼ぶまでは、同じ PreparedStatementオブジェクトを使い続けます。
    479         *
    480         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    481         * @og.rev 4.0.0.1 (2007/12/03) try 〜 catch 〜 finally をきちんと行う。
    482         *
    483         * @param stmt String
    484         */
    485        public void setStatement( final String stmt ) {
    486                boolean errFlag = true ;
    487                tempSql = stmt;
    488                try {
    489                        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    490                        if( conn == null ) { conn = ConnectionFactory.connection( DBID,appInfo ); }
    491                        Closer.stmtClose( pstmt );
    492                        pstmt = conn.prepareStatement( stmt );
    493                        errFlag = false ;
    494                }
    495                catch (SQLException ex) {
    496                        String errMsg = "Statement を作成できませんでした。" + HybsSystem.CR
    497                                                + "SQL=[" + stmt + "]"
    498                                                + ex.getMessage() + ":" + ex.getSQLState() ;
    499                        throw new HybsSystemException( errMsg,ex );
    500                }
    501                finally {
    502                        if( errFlag ) { errorFinally(); }
    503                }
    504        }
    505
    506        /**
    507         * Connection を commit します。
    508         * このオブジェクトを終了する最後に行います。
    509         *
    510         */
    511        public void commit() {
    512                boolean errFlag = true ;
    513                try {
    514                        conn.commit();
    515                        errFlag = false ;
    516                }
    517                catch (SQLException ex) {
    518                        Closer.rollback( conn );
    519                        String errMsg = "Connection をコミットできませんでした。" + HybsSystem.CR
    520                                                + ex.getMessage() + ":" + ex.getSQLState() ;
    521                        throw new HybsSystemException( errMsg,ex );
    522                }
    523                finally {
    524                        Closer.stmtClose( pstmt );
    525                        if( errFlag ) { ConnectionFactory.remove( conn,DBID ); }
    526                        else {                  ConnectionFactory.close( conn,DBID );  }
    527                        conn = null;
    528                }
    529        }
    530
    531        /**
    532         * PreparedStatement に設定する引数配列をセットします。
    533         *
    534         * この段階では、commit も、PreparedStatementのclose も行いませんので、連続して、
    535         * dbExecute( String[] ) メソッドを呼び出すことが可能です。
    536         *
    537         * @param   args オブジェクトの引数配列
    538         */
    539        public void dbExecute( final String[] args ) {
    540                // System.out.println( StringUtil.array2csv( args ) );
    541
    542                boolean errFlag = true ;
    543                try {
    544                        for( int i=0; i<args.length; i++ ) {
    545                                pstmt.setString( i+1,args[i] );
    546                        }
    547                        pstmt.execute();
    548                        errFlag = false ;
    549                }
    550                catch (SQLException ex) {
    551                        String errMsg = "データベース処理を実行できませんでした。" + HybsSystem.CR
    552                                                + "ARGS=[" + StringUtil.array2csv( args ) + "]" + HybsSystem.CR
    553                                                + "SQL=[" + tempSql + "]"
    554                                                + ex.getMessage() + ":" + ex.getSQLState() ;
    555                        throw new HybsSystemException( errMsg,ex );
    556                }
    557                finally {
    558                        if( errFlag ) { errorFinally(); }
    559                }
    560        }
    561
    562        /**
    563         * エラー発生時の処理
    564         *
    565         * PreparedStatement のクローズと、Connection の破棄を行います。
    566         */
    567        private void errorFinally() {
    568                Closer.stmtClose( pstmt );
    569                pstmt = null;
    570                Closer.rollback( conn );
    571                ConnectionFactory.remove( conn,DBID );
    572                conn = null;
    573        }
    574}