将byte []设置为SQL预编译语句

时间:2012-12-02 12:16:21

标签: java sql jdbc prepared-statement

我正在设置这样的SQL预处理语句:

prd.setBytes(i+1, temp_value);

其中temp_value的类型为byte []。

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

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

executeBatch给了我一个例外: java.sql.BatchUpdateException:将数据类型varbinary转换为数字时出错。

是否可以简单地将Bytes添加到预准备语句中,无论DataBase表中的字段是Numeric类型还是任何其他类型?

我必须特别注意我要插入的类型吗?

2 个答案:

答案 0 :(得分:2)

setBytes方法适用于SQL BLOB类型,例如varbinarylongvarbinary等。对于数字类型,您需要使用BigDecimalBigInteger或数字基元。

允许setBytes与非二进制类型一起使用的问题是系统独立性:您需要将驱动程序的多字节数的预期布局与JDBC驱动程序编写者需要的可能复杂的结构相匹配发表。发布此布局后,他们的驱动程序必须终身保持兼容。但是,大多数驱动程序编写者宁愿避免与客户端代码紧密耦合。

答案 1 :(得分:0)

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

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

同样专门针对NUMERIC类型,您应该想知道如何在对您的特定数据库有效的byte[]序列中表示它。