db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kristian Waagan <Kristian.Waa...@Sun.COM>
Subject Re: Problem storing an image in a Blob field in Java DB.
Date Fri, 12 Feb 2010 07:42:17 GMT
On 12.02.10 06:15, Erin Drummond wrote:
> Odd, I am able to put a file into the database like so:

Hi Erin and Dinesh,

First, I never saw the original messages before Erin's answer. Not sure 
what's going on, because the messages are in the archives...

> File f = new File("image.jpg");
> BufferedInputStream data = new BufferedInputStream(new FileInputStream(f));
> PreparedStatement ps = getPreparedStatement("INSERT INTO Files(RowID, Data)
> VALUES (?,?)");
> ps.setString(1, f.getName());
> ps.setBinaryStream(2, data);
> ps.execute();
> data.close();

While the two-argument setXStream methods are convenient, it is 
(currently) in general more efficient to use the three-argument version. 
It doesn't matter during insert, but you might get a performance penalty 
when accessing the LOB afterwards (depends on what you do, the devil is 
in the details; for instance getting the length will be more costly, 
simply reading the stream should be fine).

Dinesh, are you sure the stream you specified actually returns data?
The error message you posted suggests that the stream is shorter (or 
possibly longer) than what file.length() returns.
Does the input stream belong to the file object used to obtain the length?

To rule things out, you could start by inserting data from a stream 
constructed on top of a byte array, make sure you can read it back out, 
and then try reading data from the file.


> And then retrieve it like so:
> ResultSet rs = Database.executeQuery("SELECT Data FROM Files WHERE
> RowID='image.jpg'");
> BufferedInputStream bi = null;
> if (rs.next()) {
>      bi = new BufferedInputStream(rs.getBinaryStream("Data"));
> }
> //do something with bi
> Hope this helps,
> Erin
> On Fri, Feb 12, 2010 at 6:07 PM, Dinesh Bajaj<dinesh.bajaj@ymail.com>wrote:
>> I am much disappointed that I have not got a single reply to my post.
>> Surely, what I am trying to accomplish is a very simple task. Aren't Blob
>> fields supposed to store binary objects like images; then, why the database
>> can't perform this simple task?
>> -Dinesh
>> --- On *Wed, 10/2/10, Dinesh Bajaj<dinesh.bajaj@ymail.com>* wrote:
>> From: Dinesh Bajaj<dinesh.bajaj@ymail.com>
>> Subject: Problem storing an image in a Blob field in Java DB.
>> To: derby-user@db.apache.org
>> Date: Wednesday, 10 February, 2010, 11:14 PM
>> Hi All,
>> I am using Java DB 10.5, and am experiencing problem in storing an image in
>> a Blob field. I am using the below command to insert the image:
>> preparedStatement.setBinaryStream(5, inputStream, file.length());
>> The Derby throws the following exception on using the above-mentioned
>> command:
>> Error code : 0
>> SQL State = XJ001
>> Message = Java exception: 'Input stream did not have exact amount of data
>> as the requested length.:
>> org.apache.derby.iapi.services.io.DerbyIOException'.
>> If I use the method variant of setBinaryStream that doesn't take the 3rd
>> argement, then the command executes without any error, but perhaps no date
>> is stored in the database, as when the data is retrieved in a Blob variable,
>> its length is reported to be zero.
>> Thanks for any help that you can offer.
>> Regards,
>> Dinesh
>> ------------------------------
>> The INTERNET now has a personality. YOURS! See your Yahoo! Homepage<http://in.rd.yahoo.com/tagline_yyi_1/*http://in.yahoo.com/>
>> .
>> ------------------------------
>> Your Mail works best with the New Yahoo Optimized IE8. Get it NOW!<http://in.rd.yahoo.com/tagline_ie8_new/*http://downloads.yahoo.com/in/internetexplorer/>
>> .

View raw message