∟Retrieving BLOB Values with getBinaryStream() Method
This section describes how to retrieve BLOB values with the ResultSet.getBinaryStream() method.
BLOB values can also be retrieved with the getBinaryStream() method on the ResultSet object, which will return an OutputStream object.
Then you can read the BLOB values from the OutputStream object with the read() method.
The sample program below shows you how to create OutputStream objects with the getBinaryStream() method. A utility method is included
to read all bytes from an OutputStream object and save them in a file.
/**
* SqlServerBlobGetBinaryStream.java
* Copyright (c) 2007 by Dr. Herong Yang. All rights reserved.
*/
import java.io.*;
import java.sql.*;
public class SqlServerBlobGetBinaryStream {
public static void main(String [] args) {
Connection con = null;
try {
com.microsoft.sqlserver.jdbc.SQLServerDataSource ds
= new com.microsoft.sqlserver.jdbc.SQLServerDataSource();
ds.setServerName("localhost");
ds.setPortNumber(1269);
ds.setDatabaseName("AdventureWorksLT");
ds.setUser("Herong");
ds.setPassword("TopSecret");
con = ds.getConnection();
// Retrieving CLOB value with getBinaryStream()
Statement sta = con.createStatement();
ResultSet res = sta.executeQuery("SELECT * FROM Image");
int i = 0;
while (res.next() && i<1) {
i++;
System.out.println("Record ID: "+res.getInt("ID"));
System.out.println(" Subject = "+res.getString("Subject"));
InputStream bodyOut = res.getBinaryStream("Body");
String fileOut = "BlobOut_"+res.getInt("ID")+".bin";
saveOutputStream(fileOut,bodyOut);
bodyOut.close();
System.out.println(" Body = (Saved in "+fileOut+")");
}
res.close();
sta.close();
con.close();
} catch (Exception e) {
System.err.println("Exception: "+e.getMessage());
e.printStackTrace();
}
}
public static void saveOutputStream(String name, InputStream body) {
int c;
try {
OutputStream f = new FileOutputStream(name);
while ((c=body.read())>-1) {
f.write(c);
}
f.close();
} catch (Exception e) {
System.err.println("Exception: "+e.getMessage());
e.printStackTrace();
}
}
}
Surprisingly, I got two exceptions on the InputStream object.
The message says that the stream was closed by result set access.
I don't know what was wrong.
C:\>java -cp .;\local\lib\sqljdbc.jar SqlServerBlobGetBinaryStream
Record ID: 1
Subject = Test on INSERT statement
Exception: The stream was closed by result set access.
java.io.IOException: The stream was closed by result set access.
at com.microsoft.sqlserver.jdbc.PLPInputStream.checkClosed(...)
at com.microsoft.sqlserver.jdbc.PLPInputStream.read(...)
at SqlServerBlobGetBinaryStream.saveOutputStream(
SqlServerBlobGetBinaryStream.java:47)
at SqlServerBlobGetBinaryStream.main(
SqlServerBlobGetBinaryStream.java:30)
Exception: The stream was closed by result set access.
java.io.IOException: The stream was closed by result set access.
at com.microsoft.sqlserver.jdbc.PLPInputStream.checkClosed(...)
at com.microsoft.sqlserver.jdbc.PLPInputStream.close(...)
at SqlServerBlobGetBinaryStream.main(
SqlServerBlobGetBinaryStream.java:31)