1

我正在设置这样的 SQL 准备语句:

prd.setBytes(i+1, temp_value);

其中 temp_value 的类型为 byte[]。

最后,我将 prd 语句添加到这样的批处理中:

prd.addBatch();
prd.executeBatch();

executeBatch 给了我异常: java.sql.BatchUpdateException:将数据类型 varbinary 转换为数字时出错。

无论数据库表中的字段是数字类型还是任何其他类型,是否可以简单地将字节添加到准备好的语句中?

我必须具体说明我要插入的类型吗?

4

2 回答 2

2

setBytes方法旨在用于 SQL BLOB 类型,例如varbinarylongvarbinary等。对于需要使用的数字类型BigDecimalBigInteger或数字原语。

允许setBytes与非二进制类型一起使用的问题是系统独立性:您需要将驱动程序的预期布局与 JDBC 驱动程序编写者需要发布的可能非常复杂的结构相匹配。一旦发布了这个布局,他们的驱动程序就必须终生保持兼容。然而,大多数驱动程序编写者更愿意避免与客户端代码的这种紧密耦合。

于 2012-12-02T12:25:09.953 回答
1

JDBC 4.1 规范中的附录 B(数据类型转换表)列出了 JDBC 驱动程序必须实现的所有转换(对于支持的类型)。具体来说,表 B-4 列出了 Java 对象类型到 JDBC 类型的映射,表 B-5 列出了setObject(). 对于byte[],只需要 JDBC 驱动程序来支持到/从 的转换BINARYVARBINARYLONGVARBINARY.

因此,根据 JDBC 规范,您不能将setBytes()其用于其他数据类型。有些驱动程序也允许setBytes()用于其他类型,但由于这是特定于驱动程序的,因此您不应依赖该转换。您收到的错误消息非常清楚地表明您的驱动程序根本不支持这种转换。

还专门针对一种NUMERIC类型,您应该想知道如何以byte[]对您的特定数据库有效的序列来表示它。

于 2012-12-02T12:26:24.233 回答