2

Excelシートからデータを抽出し、それらをOracleテーブルに挿入しています。データベースは、バッチステートメントの実行時に、バッチ内の挿入ステートメントのいずれかが失敗した場合に、バッチ内の他のすべてのステートメントが実行されないように設定されています。だから私の問題は、どのデータ行が実際にそれを引き起こしているのかをどのように見つけることができるかということです、それで私は問題を引き起こしているデータの行番号でユーザーにメッセージを送ることができますか?

Connection con = null;
    PreparedStatement pstmt = null;
    Iterator iterator = list.iterator();
    int rowCount = list.size();
    int currentRow = 0;
    String sqlStatement = "INSERT INTO DMD_VOL_UPLOAD (ORIGIN, DESTINATION, DAY_OF_WEEK, VOLUME)";
    sqlStatement += " VALUES(?, ?, ?, ?)";
int batchSize==1000;
for(currentRow=1; currentRow<=rowCount; currentRow++){
            ForecastBatch forecastBatch = (ForecastBatch)      iterator.next();                                 
            pstmt.setString(1, forecastBatch.getOrigin());
            pstmt.setString(2, forecastBatch.getDestination());
            pstmt.setInt(3, forecastBatch.getDayOfWeek());                                          
            pstmt.setInt(4, forecastBatch.getVolumeSum());

            pstmt.addBatch();
        if(i % batchSize == 0){
                updateCounts = pstmt.executeBatch();
                con.commit();
                pstmt.clearBatch();
                session.flush();
                session.clear();
            }
        }
4

2 に答える 2

1

java.sql.Statementのjavadocによると、データベースに送信されたコマンドの1つが正しく実行されなかった場合、または結果セットを返そうとした場合に、(SQLExceptionのサブクラス)が executeBatch()スローされます。BatchUpdateException

「..この例外が発生する前に正常に実行されたバッチ更新の各更新ステートメントの更新カウントを取得する...」 getUpdateCount()の メソッドjava.sql.BatchUpdateException

これがうまくいかない場合は、エラーが発生するまで、(この特定のバッチ内の)各ステートメントの実行とコミットにフォールバックする必要があります。

于 2012-04-20T22:16:42.950 に答える
1

executeBatchバッチ内の各ステートメントによって変更されたすべての行のカウントを含む整数配列を返します。エラーを示すために負の数が使用されていると思います。この戻り値を使用して、失敗したものを特定できるはずです。

http://docs.oracle.com/javase/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html

于 2012-04-20T21:22:27.283 に答える