我正在设置这样的SQL预处理语句:
prd.setBytes(i+1, temp_value);
其中temp_value的类型为byte []。
最后,我将prd语句添加到这样的批处理中:
prd.addBatch();
prd.executeBatch();
executeBatch给了我一个例外: java.sql.BatchUpdateException:将数据类型varbinary转换为数字时出错。
是否可以简单地将Bytes添加到预准备语句中,无论DataBase表中的字段是Numeric类型还是任何其他类型?
我必须特别注意我要插入的类型吗?
答案 0 :(得分:2)
setBytes
方法适用于SQL BLOB类型,例如varbinary
,longvarbinary
等。对于数字类型,您需要使用BigDecimal
,BigInteger
或数字基元。
允许setBytes
与非二进制类型一起使用的问题是系统独立性:您需要将驱动程序的多字节数的预期布局与JDBC驱动程序编写者需要的可能复杂的结构相匹配发表。发布此布局后,他们的驱动程序必须终身保持兼容。但是,大多数驱动程序编写者宁愿避免与客户端代码紧密耦合。
答案 1 :(得分:0)
JDBC 4.1规范中的附录B(数据类型转换表)列出了JDBC驱动程序必须实现的所有转换(对于支持的类型)。具体而言,表B-4列出了将Java对象类型映射到JDBC类型,表B-5列出了setObject()
的转换矩阵。对于byte[]
,只需要JDBC驱动程序支持转换为BINARY
,VARBINARY
和LONGVARBINARY
的转换。
因此,基于JDBC规范,您不能将setBytes()
用于其他数据类型。有些驱动程序允许将setBytes()
用于其他类型,但由于这是驱动程序特定的,因此您不应该依赖于该转换。您收到的错误消息非常清楚,您的驱动程序根本不支持此转换。
同样专门针对NUMERIC
类型,您应该想知道如何在对您的特定数据库有效的byte[]
序列中表示它。