如果我理解(并测试示例 JDBC 代码;使用 Jaybird for Firebird)很好,即使使用正确的(= 尊重类型映射)更新程序方法(例如ResultSet.updateString
)或PreparedStatement
参数,也会带来“转换异常”。
在实际使用结果集(例如运行更新程序方法)之前测试实际的 Java 类型/值是否可以安全地转换为目标 SQL 数据类型,是否有可能(并且这是一个好习惯)?
“问题”只是一种方式吗?即从SQL 转换回Java 时(使用getter 方法),是否保证正确的getter 方法永远不会失败(由于转换问题)?
我的示例(使用 Jaybird 3.0.2、JDK1.8):
- 我需要更新字段:
NUMERIC(9,2)
. 对应的更新器是:ResultSet.updateBigDecimal(int columnIndex, BigDecimal x)
. 如果我使用x = new BigDecimal("123456789.1234")
(更大的精度和规模),我(逻辑上)得到一个异常: 线程“主”org.firebirdsql.jdbc.field.TypeConversionException 中的异常:转换为大十进制时出错。 - 我需要更新字段:
VARCHAR(5)
. 对应的更新器是:ResultSet.updateString(int columnIndex, String x)
. 如果我使用x = "123456"
(更长的字符串 6 > 5),我(逻辑上)得到一个异常:线程“main”java.sql.DataTruncation 中的异常:数据截断。
除了尝试运行查询和捕获异常之外,是否有一些通用的优雅方式(不取决于特定类型)如何检查实际的 Java 值/对象是否可以“保存”到某些 SQL 字段?
我想检查我的数据编辑对话框中已经存在的值(在实际运行更新查询之前)。简单的测试“VALUE OK / NOT OK”就可以了(只知道目标 SQL 类型)。
对我来说似乎很难找到我必须检查“按类型”检查的所有规则(即对于 VARCHAR 检查字符串长度,对于 NUMERIC 检查精度和比例等 - 但还有什么?或者这就足够了?对于整数和浮动类型不需要检查任何东西?)。
我试图浏览 Jaybird 源代码,但“转换过程”非常复杂(并且特定于类型),我自己找不到答案。