Java 尽管语句中存在数据,Blob字段会自动设置为null
表中有两个插入项,其中一列是Blob。在第一次插入中,blob正确存储,而在第二次插入中,它在调试时存储null,显示blobnullbinder,其中前一次显示同一字段的blobbinder。此插入在for循环中发生了两次,其中表中的其他字段不同,但blob相同。我在设置为CallableStatement之前进行了调试&它打印了两次值,但在db 2nd time中设置为null。为什么它会这样Java 尽管语句中存在数据,Blob字段会自动设置为null,java,mysql,sql,Java,Mysql,Sql,表中有两个插入项,其中一列是Blob。在第一次插入中,blob正确存储,而在第二次插入中,它在调试时存储null,显示blobnullbinder,其中前一次显示同一字段的blobbinder。此插入在for循环中发生了两次,其中表中的其他字段不同,但blob相同。我在设置为CallableStatement之前进行了调试&它打印了两次值,但在db 2nd time中设置为null。为什么它会这样 if (paramValue instanceof InputStream) ((Call
if (paramValue instanceof InputStream)
((CallableStatement) stmt).setBlob(i + 1, (InputStream) paramValue);
paramValue
的InputStream
对象在两个调用中是否相同
在这种情况下,我们可以安全地假设,当第二次迭代开始时,流已经被消耗,因此为空值
由于InputStream
不能被多次使用,因此需要缓存其内容。我建议将流的所有内容读入一个字节[]
,将其传递给您的方法并修改您的代码,如下所示:
if (paramValue instanceof byte[])
((CallableStatement) stmt).setBlob(i + 1, new ByteArrayInputStream((byte[]) paramValue));
将paramValue转换为字节[]并将其设置?是的…在第二次迭代中设置相同的值。正如您所提到的,它已经被使用了。请您解释清楚一点,以及如何解决它。