1

私は得ています

java.sql.SQLException:バッチ処理中にエラーが発生しました:バッチを実行またはクリアする必要があります

以下のコードで。2つのクエリを実行したい。

String sql_query="insert into m_status values(20,'test');select * from m_user";
String query1 = sql_query.toUpperCase();

String[] results = query1.split(";");

stmt = conn1.createStatement();
conn1.setAutoCommit(false); 
for (int i = 0; i < results.length; i++) {
    if(results[i].startsWith("SELECT")) {
        rs1 = stmt.executeQuery(results[i]);
    }
    else if(results[i].startsWith("INSERT")){
        stmt.addBatch(results[i]);
    }
}
int [] updateCounts = stmt.executeBatch();
conn1.commit(); 
if (rs1 != null)
    rs1.close();
if (stmt != null)
    stmt.close();
if (conn1 != null)
    conn1.close();
4

3 に答える 3

2

2つのステートメントを使用します。1つは選択クエリ用で、もう1つは更新用です。executeQueryそのためのバッチがあるかどうかをチェックし、あるStatament場合はそのエラーをスローします。また、クエリをtry-catch-finallyブロックにラップし、finallyブロックのリソースを閉じます。現状では、コードが接続リークにつながる可能性があります。

于 2012-06-14T09:20:15.513 に答える
1

クエリが大文字のSELECTで始まるかどうかをテストしますが、そうではありません。したがって、2つのクエリがバッチステートメントに追加されます。あなたが使うことができます

com.mysql.jdbc.StringUtils.startsWithIgnoreCase(results[i], "select");
于 2012-06-14T09:23:20.223 に答える
0

PreparedStatement#executeBatch()バッチを使用する場合は必ず使用してください。

また、必ず実行してください

int n = preparedStatement.executeUpdate();
于 2012-06-14T09:21:41.430 に答える