Как отследить нарушение ограничения внутри цикла набора результатов? - PullRequest
2 голосов
/ 16 октября 2011

Я работал над сервлетом, который сгенерирует уникальный код и обновит его в базе данных mySQL.Теперь я хочу перехватить любое исключение на случай, если уникальный код уже существует в таблице mySQL, сгенерировать новый код и попробовать обновить базу данных.Проблема в том, что я хочу сделать это в самом цикле for.Код выглядит следующим образом:

    try
    {
    connection = datasource.getConnection();
    SQLUpdate = "INSERT INTO Voucher_dump VALUES( '"+unique_code+"','08-10-2011 04:48:48','0')";
      PreparedStatement ps1 = connection.prepareStatement(SQLUpdate);
      ps1.executeUpdate();
      ResultSet r = ps1.getResultSet(); // this is where I'm checking if it's a duplicate
      if(r==null)
          out.println("This is a duplicate");
      else out.println("Updated");
      trial12= "08-10-2011 04:48:480.03999855056924717a";
      SQLUpdate = "INSERT INTO Voucher_dump VALUES( '"+trial12+"','08-10-2011 04:48:48','0')";

      ps1 = connection.prepareStatement(SQLUpdate);
      ps1.executeUpdate();
      r = ps1.getResultSet();
      if(r==null)
          out.println("This is a duplicate");
      else out.println("Updated");

    }
    catch (SQLException sqle)
    {
        sqle.printStackTrace();
    }

Я не хочу ждать до конца всего цикла, чтобы перехватить SQLException (я уже определил этот ключ в mySQL как основной).В тот момент, когда результат возвращается как повторяющаяся запись, я хочу заново сгенерировать этот ключ и повторить попытку обновления. Мой вывод для этого конкретного кода становится пустым на моей выходной странице (все остальные параметры отображаются правильно).Не отображается «Это дубликат» и «Обновляется».Возможно, ResultSet - не лучший способ сделать это.Ребята, не могли бы вы дать мне несколько советов о том, как лучше двигаться вперед?

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Несколько советов в произвольном порядке:

  1. Закройте соединение в блоке finally.
  2. Закройте операторы по отдельности, если вы будете создавать многие из них перед закрытием соединения.(«Многие» определяются вашими администраторами баз данных.)
  3. Отформатируйте ваш код.
  4. Не используйте stdout и / или stderr из реального кода.Выберите каркас ведения журналов.
  5. Подумайте об использовании некоторых вспомогательных классов для упрощения (и исправления) доступа к базе данных, например Spring JdbcTemplate .
  6. . Убедитесь, что вы включили соответствующий контекст, когда вынапишите пример кода.

Из-за # 6 я не знаю, что такое out, но я подозреваю, что причина, по которой вы ничего не видите, заключается в том, что вы вставляете дублирующее значение спервое утверждение, которое вызовет SQLException из той строки, а не в getResultSet(), где вы, кажется, ожидаете этого.Поскольку ошибка записывается в стандартный вывод, она будет где-то отображаться в журналах вашего сервера, но ничего не будет записано в out.Я не уверен, почему вы думаете, getResultSet() вернет ноль или не ноль в зависимости от того, было ли нарушение ограничения.Взгляните на javadoc для этого метода .

Обновление: 7. Как указывает BalusC, никогда, никогда не объединяет строку напрямуюв JDBC Устав.Используйте заполнители PreparedStatment и методы set* .Информацию о внедрении SQL см. В Википедии и XKCD .

.
1 голос
/ 16 октября 2011

Как насчет этого кода?

try {
            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection(url + dbName);
            System.out.println("Connected to the database");
            int i = 1;                                     //get the unique code
            boolean isInserted = false;
            while (!isInserted) {
                try {
                    PreparedStatement preparedStatement = conn.prepareStatement("INSERT INTO test values (?)");
                    preparedStatement.setInt(1, i);
                    preparedStatement.executeUpdate();
                    isInserted = true;
                } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException e) {   //Catch the particular exception which throws error on unique constraint. This may depend on Java/MySQL your version 
                    i++;                         //get the next unique code
                }
            }

            System.out.println("Disconnected from database");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...