查找 SQLException 是否由于重复而被引发

2022-09-04 08:41:15

我有一个与数据库无关的Java程序,在插入时,我需要知道是否由于重复的键而抛出了SQLException。

如果我使用单个数据库驱动程序,我会简单地使用错误代码,但由于我可以使用非常不同的引擎,因此错误代码是不一样的。

以前有人这样做过吗?有什么想法吗?

许多TIA!

编辑:我有一个配置文件,用于存储驱动程序类(即:org.apache.derby.jdbc.ClientDriver)和其他一些所需信息(即:用户名,密码,url...)。连接始终作为“java.SQL.连接“,所以我并不真正关心正在使用什么驱动程序。


答案 1

这正是 SQLException.getSQLState() 的用途。与Google一样,“23000”表示至少在MySQLPostgreSQLOracle中存在独特的约束冲突。


答案 2

使用基本的JDBC,真的没有办法以跨数据库的方式完成您所说的内容。正如你所提到的,可以使用getErrorCode,但需要供应商特定的错误代码。

我看到的解决这个问题的唯一三种方法是:

  1. 使用某种框架来完成从错误代码到有意义的异常的所有转换(Hibernate可能会这样做,其他人提到Spring会这样做)
  2. 在插入之前手动检查副本(使用选择)。(这不会是100%,因为从技术上讲,有人可以在您的查询后进行插入)。
  3. 在插入项上收到任何 sql 异常后,请尝试查询该 ID。如果您确实可以找到匹配项 - 则可以相当确定您收到的错误是由于重复的主键引起的。(尽管可能存在多个问题,但实际上并不是抛出的问题)。

我的建议是编写代码以尽可能避免问题,然后(如果绝对必要)使用#3。