如何捕获结果集循环中的约束违规?

时间:2011-10-16 08:26:02

标签: java jdbc

我正在研究一个servlet,它将生成一个唯一的代码并在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中将此键定义为primary)。此刻,结果作为重复条目返回,我想重新生成此密钥并再次尝试更新。此特定代码的输出在我的输出页面上显示为空白(所有其他参数都正确显示)。也不显示“这是重复”,也不是“更新”。也许,ResultSet不是最好的方法。你们能给我一些关于最佳前进方向的建议吗?

2 个答案:

答案 0 :(得分:3)

一些建议没有特别的顺序:

  1. 关闭finally块中的连接。
  2. 如果您在关闭连接之前创建了许多语句,请单独关闭语句。 (“许多”由您的DBA定义。)
  3. 格式化代码。
  4. 不要使用实际代码中的stdout和/或stderr。选择一个日志框架。
  5. 考虑使用一些帮助程序类来简化(和纠正)数据库访问,例如Spring的JdbcTemplate
  6. 确保在发布示例代码时包含相关上下文。
  7. 由于#6,我不知道out是什么,但我怀疑你没有看到任何东西的原因是你在第一个语句中插入重复值,这将导致来自该行的SQLException,而不是getResultSet(),您似乎期望它。由于错误被写入stdout,它将显示在某个地方的服务器日志中,但不会将任何内容写入out。我不确定为什么你认为getResultSet()将返回null或不为null,具体取决于是否存在约束违规。看看javadoc for that method

    更新 7.正如BalusC指出的那样,永远不会将字符串直接连接到JDBC Statment中。使用PreparedStatment的placeholders and set* methods。有关SQL注入的信息,请参阅WikipediaXKCD

答案 1 :(得分:1)

这段代码怎么样?

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) {
            }
        }