2013-09-12 6 views
0

В настоящее время у меня возникла проблема с записью в таблицу базы данных информации о java. Я постоянно получаюОшибка при попытке записи в DB

java.sql.SQLException: Отсутствует IN или OUT параметра с индексом :: 1

Обратите внимание, что таблица уже создана и существует.

public static void includeToDB(File file, String email) throws Exception{ 
    Connection connection = null; 
    PreparedStatement statement = null; 
    ResultSet resSet = null; 
    Date now = new Date(); 

    try { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     connection = DriverManager.getConnection(CONNECTION_STRING, USERNAME, PASSWORD); 
     String sql = "INSERT INTO T_EQ_STATEMENT_FILE_TRANS_LOG" 
       + "(SENTDATE, FILENAME, EMAIL) " + "VALUES " 
       + "("+ getCurrentTimeStamp() + "," + file.getName() + "," + email + ")"; 
      /* "INSERT INTO CAMEL.T_EQ_STATEMENT_FILE_TRANS_LOG" + 
       "   VALUES (" + 
          now + "," + 
          file.getName() + "," + 
          email + ");"; 
          */ 
     statement = connection.prepareStatement(sql); 
     ResultSet resultSet = statement.executeQuery(); 

     if(resultSet.next()) { 
      System.out.println("[DB_Handler] Information about sent file has been written to the DB... "); 
     } else { 
      System.out.println("[DB_Handler] Something went wrong, and writing the info has failed..."); 
     } 
    } catch (SQLException e) { 
     logger.error(EQSFT_ERROR_TYPE.SQL_EXCEPTION.getErrorToPrint(), e); 
     logger.error("Messgage: " + e.getMessage()); 
     logger.error("Error code: " + e.getErrorCode()); 
     logger.error("SQL state: " + e.getSQLState()); 
    } catch (Exception e) { 
     logger.error(EQSFT_ERROR_TYPE.UNKNOWN_EXCEPTION.getErrorToPrint(), e); 
    } finally { 
     if (statement != null) { 
      statement.close(); 
     } 
     if (connection != null) { 
      connection.close(); 
     } 
    } 
} 
+0

Нужно ли указывать значения? Вероятно, следует использовать 'PreparedStatement' вместо этого ... – MadProgrammer

ответ

1

Используйте PreparedStatement, когда вы должны установить в параметрах

String sql = "INSERT INTO T_EQ_STATEMENT_FILE_TRANS_LOG(SENTDATE, FILENAME, EMAIL) values (?,?,?)”; 
PreparedStatement pstm = connection.preparedStatement(sql); 
pstm.setTimeStamp(1,getCurrentTimeStamp()); 
pstm.setString(2,file.getName()); 
pstm.setString(3,email); 
+0

Большое вам спасибо. это решило мою проблему. Никогда не знал об этом (?,?,?). Будем помнить об этом с этого момента. – Ayan

0

Изменить запрос:

String sql = "INSERT INTO T_EQ_STATEMENT_FILE_TRANS_LOG" 
       + "(SENTDATE, FILENAME, EMAIL) VALUES " 
       + "(sysdate,'" + file.getName() + "','" + email + "')"; 

Вы упускаете в кавычки строк, и я не уверен, что ваш формат «время/дата» является приемлемым для Oracle.

Комментарий: лучшая практика будет использовать setParameters так, как показал Prabhaker!

0
public static void includeToDB(File file, String email) throws Exception{ 
    Connection connection = null; 
    PreparedStatement statement = null; 
    ResultSet resSet = null; 
    Date now = new Date(); 

    try { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     connection = DriverManager.getConnection(CONNECTION_STRING, USERNAME, PASSWORD); 
     String sql = "INSERT INTO T_EQ_STATEMENT_FILE_TRANS_LOG" 
       + "(SENTDATE, FILENAME, EMAIL) " + "VALUES " 
       + "(?,?,?)"; 
      /* "INSERT INTO CAMEL.T_EQ_STATEMENT_FILE_TRANS_LOG" + 
       "   VALUES (" + 
          now + "," + 
          file.getName() + "," + 
          email + ");"; 
          */ 
     statement = connection.prepareStatement(sql); 
     statement.setTimestamp(1, getCurrentTimeStamp()); 
     statement.setString(2, file.getName()); 
     statement.setString(3,email); 

     ResultSet resultSet = statement.executeQuery(); 

     if(resultSet.next()) { 
      System.out.println("[DB_Handler] Information about sent file has been written to the DB... "); 
     } else { 
      System.out.println("[DB_Handler] Something went wrong, and writing the info has failed..."); 
     } 
    } catch (SQLException e) { 
     logger.error(EQSFT_ERROR_TYPE.SQL_EXCEPTION.getErrorToPrint(), e); 
     logger.error("Messgage: " + e.getMessage()); 
     logger.error("Error code: " + e.getErrorCode()); 
     logger.error("SQL state: " + e.getSQLState()); 
    } catch (Exception e) { 
     logger.error(EQSFT_ERROR_TYPE.UNKNOWN_EXCEPTION.getErrorToPrint(), e); 
    } finally { 
     if (statement != null) { 
      statement.close(); 
     } 
     if (connection != null) { 
      connection.close(); 
     } 
    } 
} 

Вы должны использовать параметризованный запрос, как показано выше.

Вы также можете использовать Statement и CallableStatement.

http://www.tutorialspoint.com/jdbc/jdbc-statements.htm

0

BTW, даже несмотря на то, Javadoc определяет, что executeQuery никогда не возвращается null, используя executeQuery на заявлении вы знаете, это не запрос является плохой практикой. Правильный способ проверить, была ли установлена ​​запись, - использовать количество обновлений:

/* PreparedStatement constructed and used as demonstrated by Prabhaker */ 
int count = statement.executeUpdate(); 

if (count > 0) { 
    System.out.println("[DB_Handler] Information about sent file has been written to the DB... "); 
} else { 
    System.out.println("[DB_Handler] Something went wrong, and writing the info has failed..."); 
} 
+0

Да, этот метод мне тоже помог. большое спасибо. он спас столько неприятностей. теперь программа работает хорошо и вставляет данные в таблицу. – Ayan

Смежные вопросы