0

以下のコードの問題は、queries[] 配列内の特定のクエリがエラーで構成されている場合、ステートメント クエリが実行され、エラーのあるクエリの例外がスローされると仮定すると、両方のクエリを実行したいということです。クエリにエラーがないか、実行する必要はありません。目的の結果を得るには、以下のコードをどうすればよいですか? 助けてください。

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        int rw = jTable1.getRowCount();
        int col = jTable1.getColumnCount();
        System.out.println("RC" + rw);
        System.out.println("Col" + col);
        String queries[] = new String[rw];
        Object o[][] = new Object[rw][col];
        String poid = jComboBox10.getSelectedItem().toString();
        java.sql.Date xdate = null;
        Connection con=null;
        Statement st=null;
       String cc = ims.MainWindow.cc;
        try {
            for (int i = 0; i < rw; i++) {
                for (int j = 0; j < col; j++) {
                    o[i][j] = jTable1.getValueAt(i, j);
                    System.out.println("imj" + i + "," + j + "=" + o[i][j]);
                }
                if (String.valueOf(o[i][5]) == "") {
                    xdate=null;
                }
                else {
                                        xdate = new java.sql.Date(df.parse(String.valueOf(o[i][5])).getTime());

                }
                queries[i] = "insert into po_items values('" + poid + "','" + cc + "','" + o[i][1] + "'," + o[i][2] + "," + o[i][4] + ",'" + xdate + "','" + o[i][7] + "'," + o[i][8] + ")";
            }

            for (int k = 0; k < rw; k++) {
                System.out.println(queries[k]);
            }
            String query = "insert into tablex values('xx','yy')";
            con=CPool.getConnection();
            st=con.createStatement();
                con.setAutoCommit(false);
                for(int l=0;l<rw;l++)
                {
                    st.addBatch(queries[l]);
                }
                st.addBatch(query);
                st.executeBatch();
                con.commit();
            System.out.println(query);
        } catch (Exception x) {
            System.out.println(x.getMessage());
        }
        finally {
              CPool.closeConnection(con);
              CPool.closeStatement(st);
        }

    }         
4

2 に答える 2

1

例外が発生した場合は、接続を閉じる前にrollbackも実行することもありません。その結果、動作が不特定になります。ブロックが正常に完了しなかったときはいつでもcommitする必要があります。rollbacktry

PreparedStatement別の注意点として、JDBCバッチAPIを使用すると、同じステートメントの引数のみが異なるバッチエントリと組み合わせて使用​​した場合にのみパフォーマンスが向上します。他の場所でアドバイスされているPreparedStatementように、SQLインジェクション攻撃から安全になりたいかどうかに関係なく進む方法です。

于 2013-01-17T09:20:08.377 に答える
1

クエリを実行/起動しない限り、クエリがエラーになるかどうかはわかりません。

ただし、できることは、クエリをデータベース トランザクションにグループ化し、すべてが正常に機能する場合はコミットを実行し、いずれかのクエリが失敗した場合はロールバックを実行することです。これを実現するには、try catch ブロックを使用できます (例外でロールバックを実行し、それ以外の場合はコミットします)。

于 2013-01-17T08:55:01.947 に答える