经过一天的谷歌搜索后,我终于决定抽出时间向所有强大的SO社区提问。我试图将图像插入或更新到MySQL
数据库。我使用的查询和代码如下:
FileInputStream inputStream = new FileInputStream(file);
String[] str_array = file.getName().split("-");
String stringb = str_array[1];
String stringc = str_array[2];
String fingerName = stringc.substring(0, 2);
//gets file name and splits it accordingly
String id = getID.id(stringb); //does a sql lookup to get the previously inserted id according to the stringb(users unique id number)
String INSERT_PIC = "INSERT INTO database.user_picture(id_ref, picture_num, user_image) values('" + id + "', ?, ?) ON DUPLICATE KEY UPDATE user_image = ?;";
//creates the sql statement that inserts or updates according to the primary keys id_ref and picture_num
ps = (PreparedStatement) connection.prepareStatement(INSERT_PIC);
ps.setString(1, fingerName);
ps.setBinaryStream(2, (InputStream) inputStream, file.length());
ps.setBinaryStream(3, (InputStream) inputStream, file.length());
//creates the prepared statement and inserts the 3 parameters
ps.executeUpdate();
connection.commit();
//executes the query on the connected database
我很确定这会奏效。测试时,它会将图像正确插入数据库。更新时所有字段都正确更新,但blob / image字段除外,而是更改为NULL。
我不确定为什么会发生这种情况或以其他任何方式使其发挥作用,任何建议都将不胜感激......
答案 0 :(得分:1)
我的猜测是第一个setBinaryStream()使用了流。所以第二次调用setBinaryStream()只是读取“null”。
答案 1 :(得分:1)
您为参数2和3提供相同的输入流。 执行语句时,首先读取参数2流直到结束。 当JDBC驱动程序然后尝试读取参数3的流时,它已经在它的末尾,因为它是相同的流实例。
尝试提供两个输入流:
FileInputStream inputStream1 = new FileInputStream(file);
FileInputStream inputStream2 = new FileInputStream(file);
[...]
ps.setBinaryStream(2, (InputStream) inputStream1, file.length());
ps.setBinaryStream(3, (InputStream) inputStream2, file.length());
另外,不要忘记在某些finally块中关闭流。
祝你好运。