2016-08-13 11 views
0

У меня возникла проблема с получением моей программой информации из базы данных. Я бы хотел, чтобы он в основном распечатывал таблицу с извлеченной информацией (и учебник, который я выполнил, делает именно это). К сожалению, после заливки моего кода и учебников я не вижу разницы. В конце концов я хочу иметь возможность извлекать информацию из базы данных и разрешать пользователю редактировать эту информацию.java.sql.SQLException: До/после начала набора результатов

Вот мой код:

import java.sql.*; 

public class Main { 
//Driver and connection URL. 
private String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
private static String connectionString = "jdbc:mysql://localhost/employees"; 

//DB Credentials. 
private static String password = "password"; 
private static String username = "root"; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 

     try { 
      //Register JDBC Driver. 
      Class.forName("com.mysql.jdbc.Driver"); 
      connection = DriverManager.getConnection(connectionString,  username, password); 
      System.out.println("Connected to database."); 


      statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 


      resultSet = statement.executeQuery("SELECT * from employees"); 

      //process query results. 
      ResultSetMetaData metaData = resultSet.getMetaData(); 
      int numberOfColumns = metaData.getColumnCount(); 
      System.out.println("Emloyees table of Employees DB"); 

      for (int i=1; i<=numberOfColumns; i++){ 
       System.out.printf("%-10s\t", resultSet.getObject(i)); //Return the value of a given object as a java object. 
      } 
      System.out.println(); 

      //Initial cursor is before first row. 
      while(resultSet.next()){ //move cursor forward one row. 
       for (int i=1; i<=numberOfColumns; i++){ 
        System.out.printf("%-10s\t", metaData.getColumnName(i)); 
       } 
      } 
      System.out.println(); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      try{ 
       connection.close(); 
       statement.close(); 
       resultSet.close(); 
      } 
       catch(SQLException se){ 
        se.printStackTrace(); 
       } 
      } 
     System.out.println("Great! Everything works!"); 
     } 

}   

Вот мой, что происходит, когда я запускаю программу:

Fri Aug 12 19:49:55 EDT 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 

Connected to database. 
Emloyees table of Employees DB 
java.sql.SQLException: Before start of result set 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963) 
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.ResultSetImpl.checkRowPos(ResultSetImpl.java:790) 
at com.mysql.jdbc.UpdatableResultSet.checkRowPos(UpdatableResultSet.java:214) 
at com.mysql.jdbc.ResultSetImpl.getObject(ResultSetImpl.java:4432) 
at Main.main(Main.java:38) 
Great! Everything works! 

Стоит отметить: Это подключение к базе данных, и если я поменять My цикл с моим циклом while он будет печатать имя каждого столбца несколько раз, а java.sql.SQLException будет происходить после начала результирующего набора, а не раньше.

ответ

2

Ваш код не имеет смысла. Вы не можете позвонить ResultSet.getObject(), если только next() не вернулся, и вам не нужно звонить ResultSet.next() в цикле, чтобы распечатать имена столбцов. Они не меняются за строку.

Следует также предполагать, что вы хотите напечатать имена столбцов перед данными.

Цикл, который печатает имена столбцов, должен быть где цикл, который печатает значения getObject(), и наоборот.