gpt4 book ai didi

java - 如何在结果集循环内捕获约束违规?

转载 作者:行者123 更新时间:2023-11-30 07:30:33 24 4
gpt4 key购买 nike

我正在开发一个 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 中将此键定义为主要键)。此刻,结果作为重复条目返回,我想重新生成此 key 并再次尝试更新。我的输出页面上此特定代码的输出为空白(所有其他参数均正确显示)。既不显示“This is a duplicate”也不显示“Updated”。也许,ResultSet 不是最好的方法。你们能给我一些关于什么是最好的前进方向的建议吗?

最佳答案

一些建议(排名不分先后):

  1. 在 finally block 中关闭连接。
  2. 如果您要在关闭连接之前创建许多语句,请单独关闭语句。 (“许多”由您的 DBA 定义。)
  3. 格式化您的代码。
  4. 不要使用真实代码中的标准输出和/或标准错误。选择一个日志记录框架。
  5. 考虑使用一些辅助类来简化(和更正)您的数据库访问,例如 Spring 的 JdbcTemplate .
  6. 确保在发布示例代码时包含相关上下文。

由于 #6,我不知道 out 是什么,但我怀疑您没有看到任何内容的原因是您在第一条语句中插入了重复值,这将从该行引发 SQLException,而不是在 getResultSet() 处,您似乎希望它发生。由于错误被写入 stdout,它会显示在您的服务器日志中的某个地方,但不会将任何内容写入 out。我不确定您为什么认为 getResultSet() 会返回 null 或不返回 null,具体取决于是否存在约束违规。看看 javadoc for that method .

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

关于java - 如何在结果集循环内捕获约束违规?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7783164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com