![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
We have Informix 7.3 here and for various reasons we will be stuck with it for a while. I need to write some graphical objects into a database table and I was just assessing the feasibility but failed at the first hurdle <sigh>. I created the simplest of tables, like this one below: create table tt_pics ( id char(10), pic byte in blobspace ) I then tried two ways of putting things into this table: Method 1: using the LOAD command The manual was very terse about loading stuff into a table with a byte column. So I just took a shoot in the dark and hoped things would go right. I created a text file with the following content, somebody|aabbccddee| That 2nd column's value was just some bytes' values in 2-char hex number form. I then tried loading this text file into the table with an SQL command like this: load from 'the-text-file.txt' insert into tt_pics Needless to say, I got an error message: ------------------------------------------- 603: Cannot close blob. 847: Error in load file line 1. Error in line 18 Near character position 22 -------------------------------------------- So, no go there. Let's talk about method 2. Method 2: I wrote a java program like this below: ------------------------------------------- snip -------------------------------------------------------------------- import java.io.*; import java.sql.*; public class WriteBlob { static public void main( String args[] ) { String url = "jdbc:informix-sqli://localhost:8899/somedb:" + "INFORMIXSERVER=ifxsvr;user=whoever;password=dontc are"; Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; String strsql; File picFile = new File("somepic.jpg"); java.io.BufferedInputStream bin = null; int i; try { Class.forName( "com.informix.jdbc.IfxDriver" ); con = DriverManager.getConnection( url ); strsql = "insert into tt_pics values(?,?)"; pstmt = con.prepareStatement( strsql ); FileInputStream fis = new FileInputStream( picFile ); pstmt.setString( 1, "somebody" ); pstmt.setBinaryStream( 2, (InputStream) fis, 10 ); i = pstmt.executeUpdate(); System.out.println("i=" + i); } catch (ClassNotFoundException ce) { System.out.println( "Class Not Found!!" ); } catch (SQLException se) { System.out.println( "SQL exception: " + se.getMessage() ); se.printStackTrace(); } catch (Exception ie) { System.out.println( "I/O Exception " + ie.getMessage() ); } finally { try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (con != null) con.close(); } catch (Exception ep) { System.out.println( ep.getMessage() ); } } } } ------------------------------------------------ snip ----------------------------------------------------------- When I ran it, I got the following error message: SQL exception: Cannot close blob. java.sql.SQLException: Cannot close blob. at com.informix.util.IfxErrMsg.getSQLException(IfxErr Msg.java: 373) at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3207) at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3517) at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java :2352) at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.j ava:2268) at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.j ava:775) at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java :291) at com.informix.jdbc.IfxStatement.c(IfxStatement.java :1233) at com.informix.jdbc.IfxPreparedStatement.executeUpda te(IfxPreparedState ment.java:408) at WriteBlob.main(WriteBlob.java:21) There, I am now stuck. Can anybody give me a hand? _______________________________________________ Informix-list mailing list Informix-list (AT) iiug (DOT) org http://www.iiug.org/mailman/listinfo/informix-list |
#3
| |||
| |||
|
|
We have Informix 7.3 here and for various reasons we will be stuck with it for a while. I need to write some graphical objects into a database table and I was just assessing the feasibility but failed at the first hurdle <sigh>. I created the simplest of tables, like this one below: create table tt_pics ( id char(10), pic byte in blobspace ) I then tried two ways of putting things into this table: Method 1: using the LOAD command The manual was very terse about loading stuff into a table with a byte column. So I just took a shoot in the dark and hoped things would go right. I created a text file with the following content, somebody|aabbccddee| That 2nd column's value was just some bytes' values in 2-char hex number form. I then tried loading this text file into the table with an SQL command like this: load from 'the-text-file.txt' insert into tt_pics Needless to say, I got an error message: ------------------------------------------- 603: Cannot close blob. 847: Error in load file line 1. Error in line 18 Near character position 22 -------------------------------------------- So, no go there. Let's talk about method 2. Method 2: I wrote a java program like this below: ------------------------------------------- snip -------------------------------------------------------------------- import java.io.*; import java.sql.*; public class WriteBlob { static public void main( String args[] ) { String url = "jdbc:informix-sqli://localhost:8899/somedb:" + "INFORMIXSERVER=ifxsvr;user=whoever;password=dontc are"; Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; String strsql; File picFile = new File("somepic.jpg"); java.io.BufferedInputStream bin = null; int i; try { Class.forName( "com.informix.jdbc.IfxDriver" ); con = DriverManager.getConnection( url ); strsql = "insert into tt_pics values(?,?)"; pstmt = con.prepareStatement( strsql ); FileInputStream fis = new FileInputStream( picFile ); pstmt.setString( 1, "somebody" ); pstmt.setBinaryStream( 2, (InputStream) fis, 10 ); i = pstmt.executeUpdate(); System.out.println("i=" + i); } catch (ClassNotFoundException ce) { System.out.println( "Class Not Found!!" ); } catch (SQLException se) { System.out.println( "SQL exception: " + se.getMessage() ); se.printStackTrace(); } catch (Exception ie) { System.out.println( "I/O Exception " + ie.getMessage() ); } finally { try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (con != null) con.close(); } catch (Exception ep) { System.out.println( ep.getMessage() ); } } } } ------------------------------------------------ snip ----------------------------------------------------------- When I ran it, I got the following error message: SQL exception: Cannot close blob. java.sql.SQLException: Cannot close blob. at com.informix.util.IfxErrMsg.getSQLException(IfxErr Msg.java: 373) at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3207) at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3517) at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java :2352) at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.j ava:2268) at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.j ava:775) at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java :291) at com.informix.jdbc.IfxStatement.c(IfxStatement.java :1233) at com.informix.jdbc.IfxPreparedStatement.executeUpda te(IfxPreparedState ment.java:408) at WriteBlob.main(WriteBlob.java:21) There, I am now stuck. Can anybody give me a hand? |
#4
| |||
| |||
|
|
Hi, Hi, I am not sure about your first attempt because I am not certain about the encoding that is used when unloading / loading blobs in dbaccess. But I am pretty sure at least your second attempt should have worked. (though the line * * pstmt.setBinaryStream( 2, (InputStream) fis, 10 ); in your java code seems weird. Why reading exactly 10 bytes from the file? Do something like * * pstmt.setBinaryStream( 2, (InputStream) fis, (int) fis.lenght() ); instead.) I never saw that error coming up and I do the same quite often. From the error message it looks like something is wrong with your DB.... maybe the blobspace? I think it would be easy and worth trying to locate the blob in tablespace instead of blobspace for a test. Regards, Dirk -- -- -- Dipl.-Math. Dirk Gunsthvel -- -professional services- -- -- Dirk Gunsthvel IT Systemanalyse - GunCon -- Hammer Str. 13 -- D-48153 Muenster -- phone: +49 (0) 251 28446- 0 -- fax: * +49 (0) 251 28446-55 -- web: *http://www.GunCon.de -- email: i... (AT) GunCon (DOT) de -- UStId: DE 189527667 -- -- * * 'One now understands why some animals eat their young.' -- * * (Andrew in 'Bicentennial Man' 1999) "emrefan" <dksle... (AT) hotmail (DOT) com> schrieb im Newsbeitragnews:f25c7ceb-3b61-4185-a005-5097536252bd (AT) 42g2000prb (DOT) googlegroups.com... We have Informix 7.3 here and for various reasons we will be stuck with it for a while. I need to write some graphical objects into a database table and I was just assessing the feasibility but failed at the first hurdle <sigh>. *I created the simplest of tables, like this one below: create table tt_pics ( * * id * * * *char(10), * * pic * * *byte in blobspace ) I then tried two ways of putting things into this table: Method 1: using the LOAD command The manual was very terse about loading stuff into a table with a byte column. So I just took a shoot in the dark and hoped things would go right. I created a text file with the following content, somebody|aabbccddee| That 2nd column's value was just some bytes' values in 2-char hex number form. I then tried loading this text file into the table with an SQL command like this: load from 'the-text-file.txt' insert into tt_pics Needless to say, I got an error message: ------------------------------------------- *603: Cannot close blob. *847: Error in load file line 1. Error in line 18 Near character position 22 -------------------------------------------- So, no go there. Let's talk about method 2. Method 2: I wrote a java program like this below: ------------------------------------------- snip -------------------------------------------------------------------- import java.io.*; import java.sql.*; public class WriteBlob { * static public void main( String args[] ) { * * *String url = "jdbc:informix-sqli://localhost:8899/somedb:"+ "INFORMIXSERVER=ifxsvr;user=whoever;password=dontc are"; * * *Connection con = null; * * *PreparedStatement pstmt = null; * * *ResultSet rs = null; * * *String strsql; * * *File picFile = new File("somepic.jpg"); * * *java.io.BufferedInputStream bin = null; * * *int i; * * *try { * * * * Class.forName( "com.informix.jdbc.IfxDriver" ); * * * * con = DriverManager.getConnection( url ); * * * * strsql = "insert into tt_pics values(?,?)"; * * * * pstmt = con.prepareStatement( strsql ); * * * * FileInputStream fis = new FileInputStream( picFile ); * * * * pstmt.setString( 1, "somebody" ); * * * * pstmt.setBinaryStream( 2, (InputStream) fis, 10 ); * * * * i = pstmt.executeUpdate(); * * * * System.out.println("i=" + i); * * *} catch (ClassNotFoundException ce) { * * * * System.out.println( "Class Not Found!!" ); * * *} catch (SQLException *se) { * * * * System.out.println( "SQL exception: " + se.getMessage()); * * * * se.printStackTrace(); * * *} catch (Exception ie) { * * * * System.out.println( "I/O Exception " + ie.getMessage() ); * * *} finally { * * * * try { * * * * * *if (rs != null) * * * * * * * rs.close(); * * * * * *if (pstmt != null) * * * * * * * pstmt.close(); * * * * * *if (con != null) * * * * * * * con.close(); * * * * } catch (Exception ep) { * * * * * System.out.println( ep.getMessage() ); * * * * } * * *} * } } ------------------------------------------------ snip ----------------------------------------------------------- When I ran it, I got the following error message: SQL exception: Cannot close blob. java.sql.SQLException: Cannot close blob. * * * *at com.informix.util.IfxErrMsg.getSQLException(IfxErr Msg..java: 373) * * * *at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3207) * * * *at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3517) * * * *at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java :2352) * * * *at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.j ava:2268) * * * *at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.j ava:775) * * * *at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java :291) * * * *at com.informix.jdbc.IfxStatement.c(IfxStatement.java :1233) * * * *at com.informix.jdbc.IfxPreparedStatement.executeUpda te(IfxPreparedState ment.java:408) * * * *at WriteBlob.main(WriteBlob.java:21) There, I am now stuck. *Can anybody give me a hand? |
#5
| |||
| |||
|
|
Get Jonathan Leffler's sqlcmd package it contains simple utilities to load data into a blob = insblob.ec, updblob.ec, etc. Art Art S. Kagel Advanced DataTools (www.advancedatatools.com) IIUG Board of Directors (a... (AT) iiug (DOT) org) |
#6
| |||
| |||
|
|
Hi, Hi, I am not sure about your first attempt because I am not certain about the encoding that is used when unloading / loading blobs in dbaccess. But I am pretty sure at least your second attempt should have worked. (though the line * * pstmt.setBinaryStream( 2, (InputStream) fis, 10 ); in your java code seems weird. Why reading exactly 10 bytes from the file? Do something like * * pstmt.setBinaryStream( 2, (InputStream) fis, (int) fis.lenght() ); instead.) I never saw that error coming up and I do the same quite often. From the error message it looks like something is wrong with your DB.... maybe the blobspace? I think it would be easy and worth trying to locate the blob in tablespace instead of blobspace for a test. Regards, Dirk -- -- -- Dipl.-Math. Dirk Gunsthövel -- -professional services- -- -- Dirk Gunsthövel IT Systemanalyse - GunCon -- Hammer Str. 13 -- D-48153 Muenster -- phone: +49 (0) 251 28446- 0 -- fax: * +49 (0) 251 28446-55 -- web: *http://www.GunCon.de -- email: i... (AT) GunCon (DOT) de -- UStId: DE 189527667 -- -- * * 'One now understands why some animals eat their young.' -- * * (Andrew in 'Bicentennial Man' 1999) "emrefan" <dksle... (AT) hotmail (DOT) com> schrieb im Newsbeitragnews:f25c7ceb-3b61-4185-a005-5097536252bd (AT) 42g2000prb (DOT) googlegroups.com... We have Informix 7.3 here and for various reasons we will be stuck with it for a while. I need to write some graphical objects into a database table and I was just assessing the feasibility but failed at the first hurdle <sigh>. *I created the simplest of tables, like this one below: create table tt_pics ( * * id * * * *char(10), * * pic * * *byte in blobspace ) I then tried two ways of putting things into this table: Method 1: using the LOAD command The manual was very terse about loading stuff into a table with a byte column. So I just took a shoot in the dark and hoped things would go right. I created a text file with the following content, somebody|aabbccddee| That 2nd column's value was just some bytes' values in 2-char hex number form. I then tried loading this text file into the table with an SQL command like this: load from 'the-text-file.txt' insert into tt_pics Needless to say, I got an error message: ------------------------------------------- *603: Cannot close blob. *847: Error in load file line 1. Error in line 18 Near character position 22 -------------------------------------------- So, no go there. Let's talk about method 2. Method 2: I wrote a java program like this below: ------------------------------------------- snip -------------------------------------------------------------------- import java.io.*; import java.sql.*; public class WriteBlob { * static public void main( String args[] ) { * * *String url = "jdbc:informix-sqli://localhost:8899/somedb:" + "INFORMIXSERVER=ifxsvr;user=whoever;password=dontc are"; * * *Connection con = null; * * *PreparedStatement pstmt = null; * * *ResultSet rs = null; * * *String strsql; * * *File picFile = new File("somepic.jpg"); * * *java.io.BufferedInputStream bin = null; * * *int i; * * *try { * * * * Class.forName( "com.informix.jdbc.IfxDriver" ); * * * * con = DriverManager.getConnection( url ); * * * * strsql = "insert into tt_pics values(?,?)"; * * * * pstmt = con.prepareStatement( strsql ); * * * * FileInputStream fis = new FileInputStream( picFile ); * * * * pstmt.setString( 1, "somebody" ); * * * * pstmt.setBinaryStream( 2, (InputStream) fis, 10 ); * * * * i = pstmt.executeUpdate(); * * * * System.out.println("i=" + i); * * *} catch (ClassNotFoundException ce) { * * * * System.out.println( "Class Not Found!!" ); * * *} catch (SQLException *se) { * * * * System.out.println( "SQL exception: " + se.getMessage() ); * * * * se.printStackTrace(); * * *} catch (Exception ie) { * * * * System.out.println( "I/O Exception " + ie.getMessage() ); * * *} finally { * * * * try { * * * * * *if (rs != null) * * * * * * * rs.close(); * * * * * *if (pstmt != null) * * * * * * * pstmt.close(); * * * * * *if (con != null) * * * * * * * con.close(); * * * * } catch (Exception ep) { * * * * * System.out.println( ep.getMessage() ); * * * * } * * *} * } } ------------------------------------------------ snip ----------------------------------------------------------- When I ran it, I got the following error message: SQL exception: Cannot close blob. java.sql.SQLException: Cannot close blob. * * * *at com.informix.util.IfxErrMsg.getSQLException(IfxErr Msg.java: 373) * * * *at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3207) * * * *at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3517) * * * *at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java :2352) * * * *at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.j ava:2268) * * * *at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.j ava:775) * * * *at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java :291) * * * *at com.informix.jdbc.IfxStatement.c(IfxStatement.java :1233) * * * *at com.informix.jdbc.IfxPreparedStatement.executeUpda te(IfxPreparedState ment.java:408) * * * *at WriteBlob.main(WriteBlob.java:21) There, I am now stuck. *Can anybody give me a hand?- 隱藏被引用文* - - 顯示被引用文* - |
#7
| |||
| |||
|
|
I assume that you freshly added the blobspace. In that case you have to do an onmode -l; onmode -c otherwise you can not write to the newly added blobspace. or the damn thing was full....???? |
#8
| |||
| |||
|
|
We have Informix 7.3 here and for various reasons we will be stuck with it for a while. I need to write some graphical objects into a database table and I was just assessing the feasibility but failed at the first hurdle<sigh>. I created the simplest of tables, like this one below: create table tt_pics ( id char(10), pic byte in blobspace ) I then tried two ways of putting things into this table: Method 1: using the LOAD command The manual was very terse about loading stuff into a table with a byte column. So I just took a shoot in the dark and hoped things would go right. I created a text file with the following content, somebody|aabbccddee| That 2nd column's value was just some bytes' values in 2-char hex number form. I then tried loading this text file into the table with an SQL command like this: load from 'the-text-file.txt' insert into tt_pics Needless to say, I got an error message: ------------------------------------------- 603: Cannot close blob. 847: Error in load file line 1. Error in line 18 Near character position 22 -------------------------------------------- |
|
So, no go there. Let's talk about method 2. Method 2: [...snip...] There, I am now stuck. Can anybody give me a hand? |
#9
| |||
| |||
|
|
On 5/14/10 12:45 AM, emrefan wrote: We have Informix 7.3 here and for various reasons we will be stuck with it for a while. I need to write some graphical objects into a database table and I was just assessing the feasibility but failed at the first hurdle<sigh>. *I created the simplest of tables, like this one below: create table tt_pics ( * * * id * * * *char(10), * * * pic * * *byte in blobspace ) I then tried two ways of putting things into this table: Method 1: using the LOAD command The manual was very terse about loading stuff into a table with a byte column. So I just took a shoot in the dark and hoped things would go right. I created a text file with the following content, somebody|aabbccddee| That 2nd column's value was just some bytes' values in 2-char hex number form. I then tried loading this text file into the table with an SQL command like this: load from 'the-text-file.txt' insert into tt_pics Needless to say, I got an error message: ------------------------------------------- * *603: Cannot close blob. * *847: Error in load file line 1. Error in line 18 Near character position 22 -------------------------------------------- That's a weird error. *The load file you showed should have worked fine. I was doing some blob work last week - using SQLCMD rather than DB-Access - but I'm 99.5% sure it would have worked OK in DB-Access too. * The one difference was I was using BYTE {IN TABLE}; can you try that temporarily? *That will help isolate the issue. |
|
You said Informix 7.3; did you mean 7.30.UC1 or 7.31.UD9? *There's about a decade between the releases. *You've left it a bit late if you are using a 7.30 or 7.31.UCx version to upgrade, but... |
![]() |
| Thread Tools | |
| Display Modes | |
| |