2016-05-11 2 views
0

Я хочу выполнить несколько операторов SQL и написать их вывод в файле excel. Я написал код для этого, но при выполнении этого выдает ошибкуJava Выполнение нескольких операторов SQL и запись в excel

java.sql.BatchUpdateException: Не может выдавать ВЫБРАТЬ через executeUpdate() или executeLargeUpdate(). на com.mysql.jdbc.SQLError.createBatchUpdateException (SQLError.java:1158) на com.mysql.jdbc.StatementImpl.executeBatchInternal (StatementImpl.java:1049) в com.mysql.jdbc.StatementImpl.executeBatch (StatementImpl .java: 959) в Demo.DatabaseQry (Demo.java:133) на Demo.main (Demo.java:48) Вызвано по: java.sql.SQLException: не удается выполнить SELECT с помощью executeUpdate() или executeLargeUpdate (). на com.mysql.jdbc.SQLError.createSQLException (SQLError.java:957) при com.mysql.jdbc.SQLError.createSQLException (SQLError.java:896) в com.mysql.jdbc.SQLError.createSQLException (SQLError. Java: 885) на com.mysql.jdbc.SQLError.createSQLException (SQLError.java:860) при com.mysql.jdbc.StatementImpl.executeUpdateInternal (StatementImpl.java:1504) на 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"); 
    } 
+0

Сообщение об ошибке должно быть совершенно ясно. Удалите stmt.executeBatch(). Вместо этого вы должны выполнить все свои заявления самостоятельно и запомнить набор результатов. – Frank

+0

@Frank Итак, как мне выполнить эти кучу утверждений, упомянутых выше, после удаления executeBatch()? – Peter

ответ

1

Вы не можете использовать addBatch для выбора запросов. statement.addBatch() предназначен только для запросов update/insert/delete или запросов, которые не дают никаких результатов.

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 и TotalTasks.

закрыть заявление и в ResultSet, наконец, блок

rsTotalAssets.close(); 
    stmt1.close(); 
+0

вы можете помочь мне с кодом? что я должен написать, чтобы решить эту проблему? – Peter

+0

@RonakPandya обновил мой ответ с более подробной информацией о том, как вы можете обрабатывать запрос выбора. Вы можете обратиться за дополнительными пояснениями: https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html – Vijay

+0

Спасибо, что работает. – Peter

1

Вы должны сделать что-то подобное это для всех ваших querystrings:

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

Exceptionhandling осталось сделать для себя. ;-)

0

Final Код:

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"); 
    }