- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我理解(并测试示例 JDBC 代码;使用 Jaybird for Firebird),即使使用正确的(= 尊重类型映射)更新方法(例如 ResultSet.updateString
),或者也许 PreparedStatement
参数,也可能带来“转换异常” ”。
在实际使用结果集(例如运行更新程序方法)之前是否可以(并且这是一个好的做法)测试实际的 Java 类型/值是否可以安全地转换为目标 SQL 数据类型?
“问题”只是单向吗? IE。当从SQL转换回Java时(使用getter方法),是否保证正确的getter方法永远不会失败(由于转换问题)?
我的示例(使用 Jaybird 3.0.2、JDK1.8):
NUMERIC(9,2)
。对应的更新器是: ResultSet.updateBigDecimal(int columnIndex, BigDecimal x)
。如果我使用 x = new BigDecimal("123456789.1234")
(更大的精度和规模),我(逻辑上)会得到一个异常:线程“main”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 源代码,但“转换过程”非常复杂(并且特定于类型),我自己找不到答案。
最佳答案
在实际设置值之前,JDBC 不提供任何内容来“检查”值,因此 Jaybird 也不提供:设置值就是检查。确切的行为取决于驱动程序,Jaybird 尝试验证设置值,但其他驱动程序可能会选择将其推迟到数据库本身(因此错误只会在执行时发生)。
通常,您会根据业务需求设计数据库并选择列类型,这自然会在您尝试将其放入数据库之前进行验证。
如果您到目前为止还没有这样做,请开始通过限制长度、使用 Hibernate Validator 之类的东西或 UI 框架的验证来向您的输入表单添加验证。
如果您正在处理高度动态的需求(例如用户提供的查询等),那么您应该使用 JDBC 提供的功能来创建您自己的验证:ParameterMetaData
准备好的声明和 ResultSetMetaData
结果集(也可以从准备好的语句访问),特别是这些对象的 getPrecision
(和 getScale
),甚至可能是 DatabaseMetadata.getColumns
之类的东西.
对于字符类型,getPrecision
将指示最大字符数,对于 numeric
或 decimal
类型,您可以使用最大数量小数点之前的数字作为精度 - 小数位
。
但是在 Jaybird 中,这并不是 100% 准确,例如,如果 Jaybird 无法识别底层,getPrecision
可能会为 numeric(8,2)
返回 9列,Jaybird(和 Firebird)实际上允许精度高达 10,但有一些限制(即 Integer.MAX_VALUE
的未缩放最大值,即该类型的 21474836.47)。
关于第二个问题,使用 getter 是否会导致转换异常:正常情况不会,但例如在值较大的 BIGINT
上调用 getInt()
比 Integer.MAX_VALUE
或 Integer.MIN_VALUE
会。
关于Java JDBC 类型转换(Firebird/Jaybird): check value/type compatibility before using getter or updater ResultSet method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329576/
我是 Firebird 的新手,使用其 Java 版本 Jaybird,但无法从数据库(.fdb 文件)连接。问题是这样的: org.firebirdsql.jdbc.FBSQLException:
您知道是否有一种方法可以在 jaybird 的选择查询上使用数据监听器。 例如,我有一个类似的查询 select count (*) from my_table where my_statut='x'
我正在使用 Java 中的 Firebird 数据库。一切正常,但如果数据库文件路径包含国家字符,例如,我在连接到数据库时遇到问题。 “á”或“č”。 异常示例: org.firebirdsql.jd
我有这个 Java 代码: Connection conn = connectionProvider.getConnection(); statement = conn.prepareCall("ex
我需要使用数据库 Firebird,为此我使用 Jaybird 2.2.9。 当我使用 MySQL 驱动程序时,将 ResultSet 转换为 Object 如下: empresa.setBairro
可能我问的是一个常见问题,但我真的不明白我做错了什么,以及当我尝试通过 Jaybird 连接我的 Firebird DB 时我可能会忘记什么。我已将 Jaybird.jar 添加到我的 Java 构建
我正在使用 JDBC 连接到 firebird。 org.firebirdsql.jdbc jaybird-jdk18 3.0.5 当我读取数据时: resultSet.next(); //resul
我是 Linux/Java/Scriptella 的新手,我正在尝试在 Firebird 本地数据库上使用 scriptella 进行 jdbc 连接,但我收到以下错误: 2-dic-2013 1.0
我正在使用 jaybird 2.2.3 和 hibernate 3.5,当我使用向导 hibernate 映射文件和 pojos 数据库时出现以下错误“java.lang.NullPointerExc
我很想看看 Firebird 与 Hibernate 的性能,但我无法让它正确运行。我添加到我的 pom.xml: net.sf.squirrel-sql.thirdparty-non-ma
在以前版本的 jaybird (2.2) 中,我能够对 Firebird 服务器执行服务 API 以获取 Activity 事务标记:OIT、OAT、Next 等。 在 3.0 版中,我找不到正确的方
我正在创建一个连接到 Firebird 数据库并检索一些数据的 Java 应用程序。程序完成,在我的电脑上运行良好。问题是,在我需要运行应用程序的计算机上,数据库位于本地网络中的另一台计算机上,我不知
我确实通过 FBUserManager.add(user) 在 Firebird 中成功创建了一个新用户。我也成功连接到了我已经创建的数据库。我无法知道如何运行查询,我收到消息: “org.fireb
我在 Android 上使用 Firebird 直接 wifi 连接创建了一个应用程序。有时我会收到此错误: FATAL EXCEPTION: AsyncTask #4 java.lang.Runti
我正在 eclipse 中开发一个小程序,当从 eclipse 的 AppletViewer 执行时,它可以正常工作,但是当从 .html 文件执行时,它不会执行 class.forName() 方法
我对使用联合的新 SQL 查询有点困惑。 我使用 jaybird 2.2.8 在 java 应用程序中请求我的 firebird 数据库。通常我使用 MetaData 解析我的结果集 ResultSe
当使用嵌入式 firebird 导出我的 java 项目时,我在控制台中收到以下消息: “在 java.library.path 中没有 jaybird[22[任何版本,我猜]]”。 但它实际上是在我
我一直在开发一个连接到 Firebird 数据库并监听事件的程序。我试图让它与嵌入式数据库一起工作。 EventManager em = new FBEventManager(GDSType.getT
我正在尝试使用 lib jaybird 2.1.6 在 Firebird 数据库的 blob 字段中插入文件。 首先,我在数据库中创建一条记录,然后,使用记录 ID,尝试将文件插入到 blob(子类型
我已将 Wildfly 10 中的 Jaybird 依赖项从 Jaybird 2.2.11 升级到 Jaybird 3.0.0-alpha-1。当我尝试创建连接时,我现在遇到以下异常。 启动后的第一个
我是一名优秀的程序员,十分优秀!