gpt4 book ai didi

java - 插入 BLOB 失败,文件为 NULL

转载 作者:行者123 更新时间:2023-11-30 03:51:43 29 4
gpt4 key购买 nike

在 Java 中,使用 JDBC,我尝试在 Oracle 数据库表的 BLOB 列中插入文件。

这是我的操作方法:

private Statement getStatement(File f, String fid, Long dex, String uid, int id)
{
FileInputStream fis = null;
PreparedStatement statement;
try
{
statement = connection.prepareStatement("INSERT INTO BLOBTABLE (FID, FDEX, SFILE, UID, ID) VALUES (?, ?, ?, ?, ?)");
statement.setString(1, fid);
statement.setLong(2, dex);
fis = new FileInputStream(file);
statement.setBinaryStream(3, fis, file.length());
statement.setString(4, uid);
statement.setInt(5, id);
}
finally
{
if (fis != null)
fis.close();
}
return statement;
}

private insertStuff()
{
File f = new File("/home/user/thisFileExists");
PreparedStatement statement = getStatement(f, "XYZ", 18L, "ABC", 78);
statement.execute();
}

运行 .execute 时,我收到 Oracle 错误:

java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("ORACLEUSER"."BLOBTABLE"."SFILE")

SFILE 是 BLOB 列。所以这意味着链末端的数据库在查询中收到 NULL。

怎么会这样?

如果我更换:

statement.setBinaryStream(3, fis, file.length());

与:

statement.setBinaryStream(3, new ByteArrayInputStream(("RANDOMSTRING".getBytes())));

它的工作原理是在某种程度上不喜欢我的文件流。

我关闭流有问题吗?他们在我看到的所有样本上都是这样做的。

最佳答案

在执行该语句之前,您将关闭FileInputStream,因此该语句无法在实际需要时获取数据。最好将 InputStream 传递到您的方法中,这样您就可以在语句执行后从外部关闭它:

private insertStuff() {
File file = new File("/home/user/thisFileExists");
try (InputStream stream = new FileInputStream(file)) {
PreparedStatement statement = getStatement(stream, "XYZ", 18L, "ABC", 78);
statement.execute();
}
}

...其中 getStatement 将接受 InputStream 而不是 File,并使用 setBinaryStream 的重载> 不需要数据长度。或者,您可以传入 File,它可以打开流、创建语句、执行语句,然后关闭流。

顺便说一句,您也应该使用 try-with-resource 或 try/finally 语句来关闭该语句。

关于java - 插入 BLOB 失败,文件为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268847/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com