Java执行多个SQL语句并写入excel

我想要执行多个SQL语句并将其输出写入Excel文件中。 我已经写了一些代码,但执行时会抛出一个错误

java.sql.BatchUpdateException:不能通过executeUpdate()或executeLargeUpdate()发出SELECT。 com.mysql.jdbc.SQLError.createBatchUpdateException(SQLError.java:1158)at com.mysql.jdbc.StatementImpl.executeBatchInternal(StatementImpl.java:1049)at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:959 )在Demo.main(Demo.java:48)的Demo.DatabaseQry(Demo.java:133)导致:java.sql.SQLException:无法通过executeUpdate()或executeLargeUpdate()发出SELECT。 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885 )at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1504)at com.mysql.jdbc.StatementImpl.executeBatchInternal(StatementImpl.java: 1023)… 3更多

我的代码是…

public static void DatabaseQry(String ipAdd, String dbNm, String dbUnm, String dbPasswd) { String ipAddress, dbName, dbUserId, dbPassword, fileLocation; Connection conn = null; Statement stmt = null; try { ipAddress = ipAdd; dbName = dbNm; dbUserId = dbUnm; dbPassword = dbPasswd; BufferedReader brd = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter Output File location: "); fileLocation = brd.readLine(); // Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); // Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection("jdbc:mysql://" + ipAddress + ":3306/" + dbName, dbUserId, dbPassword); // Execute a query System.out.println("Working on Query..."); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); //String TotalWorkflow = "SELECT COUNT(*) AS TOTAL_WORKFLOW FROM M_OBJECT WHERE TYPE_ IN(7)"; String TotalAssets = "SELECT COUNT(*) AS TOTAL_ASSET FROM M_OBJECT WHERE TYPE_ IN(1,2,3)"; String TotalJobs = "SELECT COUNT(*) AS TOTAL_JOBS FROM M_OBJECT WHERE TYPE_ IN(6)"; String TotalTasks = "SELECT COUNT(*) AS TOTAL_TASKS FROM M_OBJECT WHERE TYPE_ IN(5)"; conn.setAutoCommit(false); //stmt.addBatch(TotalWorkflow); stmt.addBatch(TotalAssets); stmt.addBatch(TotalJobs); stmt.addBatch(TotalTasks); //Workflow total count ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS TOTAL_WORKFLOW FROM M_OBJECT WHERE TYPE_ IN(7)"); rs.last(); stmt.executeBatch(); conn.commit(); rs.last(); System.out.println("Batch executed"); // Excel file generation code HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Readings"); HSSFFont font = workbook.createFont(); font.setFontHeightInPoints((short)12); font.setFontName("Arial"); // font.setColor(IndexedColors.DARK_BLUE.getIndex()); font.setBold(true); HSSFCellStyle style = workbook.createCellStyle(); style.setBorderTop((short) 6); // double lines border style.setBorderBottom((short) 2); // single line border style.setFont(font); style.setFillPattern(CellStyle.BORDER_DASH_DOT); sheet.createFreezePane(0, 1); // Freeze 1st Row sheet.createFreezePane(int colSplit, int rowSplit, int leftmostColumn, int topRow) // Extract data from result set for (int i = 1; rs.next(); i++) { HSSFRow row = sheet.createRow(1); HSSFRow rowhead = sheet.createRow((short) 0); rowhead.setRowStyle(style); // For Workflow rowhead.createCell(8).setCellValue("WORKFLOWS"); row.createCell(8).setCellValue(rs.getString("TOTAL_WORKFLOW")); // For Assets rowhead.createCell(9).setCellValue("ASSETS"); row.createCell(9).setCellValue(rs.getString("TOTAL_ASSET")); // For Jobs rowhead.createCell(10).setCellValue("JOBS"); row.createCell(10).setCellValue(rs.getString("TOTAL_JOBS")); // For Tasks rowhead.createCell(11).setCellValue("TASKS"); row.createCell(11).setCellValue(rs.getString("TOTAL_TASKS")); //row.createCell(1).setCellValue(rs.getString("EXCEPTION_COUNT_")); } // FileOutputStream fileOut = new FileOutputStream(filename); FileOutputStream fileOut = new FileOutputStream(fileLocation + "\\Readings.xls"); workbook.write(fileOut); fileOut.close(); System.out.println("Excel file has been generated"); // Clean-up environment rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // Handle errors for JDBC System.out.println("Unable to make connection with database...!"); se.printStackTrace(); } catch (Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources System.out.println("\n\nPress \"Enter\" to exit...\n"); try { System.in.read(); } catch (Exception e) { e.printStackTrace(); } try { if (stmt != null) stmt.close(); } catch (SQLException se2) { } // nothing we can do try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } // end finally try } // end try System.out.println("Execution Completed"); } 

您不能使用addBatch进行select查询。 statement.addBatch()仅用于更新/插入/删除查询或不提供任何结果的查询。

  String TotalAssets = "SELECT COUNT(*) AS TOTAL_ASSET FROM M_OBJECT WHERE TYPE_ IN(1,2,3)"; stmt1 = con.createStatement(); ResultSet rsTotalAssets = stmt1.executeQuery(TotalAssets); rsTotalAssets.next(); int totalAssetsCount = rsTotalAssets.getInt("TOTAL_ASSET"); 

使用totalAssetsCount设置适当的单元格值。 重复上面的代码TotalJobs和TotalTask​​s。

closuresfinally块中的语句和结果集

  rsTotalAssets.close(); stmt1.close(); 

你应该为所有querystrings做这样的事情:

 private static String getResult(String query, String resultParamName) { stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); rs.last(); return rs.getString(resultParamName); } 

exception处理是自己做的。 😉

最终代码:

 public static void DatabaseQry(String ipAdd, String dbNm, String dbUnm, String dbPasswd) { String ipAddress, dbName, dbUserId, dbPassword, fileLocation; Connection conn = null; Statement stmt = null; try { ipAddress = ipAdd; dbName = dbNm; dbUserId = dbUnm; dbPassword = dbPasswd; BufferedReader brd = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter Output File location: "); fileLocation = brd.readLine(); // Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); // Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection("jdbc:mysql://" + ipAddress + ":3306/" + dbName, dbUserId, dbPassword); // Execute a query System.out.println("Working on Query..."); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); String TotalWorkflow = "SELECT COUNT(*) AS TOTAL_WKFLW FROM TableName WHERE TYP_ IN(7)"; stmt = conn.createStatement(); String TotalAssets = "SELECT COUNT(*) AS TOTAL_ASSET FROM TableName WHERE TYP_ IN(1,2,3)"; String TotalJobs = "SELECT COUNT(*) AS TOTAL_J FROM TableName WHERE TYP_ IN(6)"; String TotalTasks = "SELECT COUNT(*) AS TOTAL_T FROM TableName WHERE TYP_ IN(5)"; ResultSet rs = stmt.executeQuery(TotalWorkflow); rs.next(); int totalWorkflowCount = rs.getInt("TOTAL_WKFLW"); rs = stmt.executeQuery(TotalAssets); rs.next(); int totalAssets = rs.getInt("TOTAL_ASSET"); rs = stmt.executeQuery(TotalJobs); rs.next(); int totalJobs = rs.getInt("TOTAL_J"); rs = stmt.executeQuery(TotalTasks); rs.next(); int totalTasks = rs.getInt("TOTAL_T"); // Excel file generation code HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Readings"); HSSFFont font = workbook.createFont(); font.setFontHeightInPoints((short)12); font.setFontName("Arial"); font.setBold(true); HSSFCellStyle style = workbook.createCellStyle(); style.setBorderTop((short) 6); // double lines border style.setBorderBottom((short) 2); // single line border style.setFont(font); style.setFillPattern(CellStyle.FINE_DOTS); sheet.createFreezePane(0, 1); // Freeze 1st Row sheet.createFreezePane(int colSplit, int rowSplit, int leftmostColumn, int topRow) HSSFRow row = sheet.createRow(1); HSSFRow rowhead = sheet.createRow((short) 0); rowhead.setRowStyle(style); // For Workflow rowhead.createCell(8).setCellValue("WORKFLOWS"); row.createCell(8).setCellValue(totalWorkflowCount); // For Assets rowhead.createCell(9).setCellValue("ASSETS"); row.createCell(9).setCellValue(totalAssets); // For Jobs rowhead.createCell(10).setCellValue("JOBS"); row.createCell(10).setCellValue(totalJobs); // For Tasks rowhead.createCell(11).setCellValue("TASKS"); row.createCell(11).setCellValue(totalTasks); // FileOutputStream fileOut = new FileOutputStream(filename); FileOutputStream fileOut = new FileOutputStream(fileLocation + "\\Readings.xls"); workbook.write(fileOut); fileOut.close(); System.out.println("Excel file has been generated"); // Clean-up environment rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // Handle errors for JDBC System.out.println("Unable to make connection with database...!"); se.printStackTrace(); } catch (Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources System.out.println("\n\nPress \"Enter\" to exit...\n"); try { System.in.read(); } catch (Exception e) { e.printStackTrace(); } try { if (stmt != null) stmt.close(); } catch (SQLException se2) { } // nothing we can do try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } // end finally try } // end try System.out.println("Execution Completed"); }