10k的时候运行结果是什么??详细结果!!
你把
pstmt1.setBinaryStream(1, fis, (int) csvfilepath.length());
改为
pstmt1.setBinaryStream(1, fis, (int) fis.available());
试试

解决方案 »

  1.   

    我建议到otn.oracle.com上去看一下oracle数据库大对象的处理,他和标准的有一些差别
      

  2.   

    我建议到otn.oracle.com上去看一下oracle数据库大对象的处理,他和标准的有一些差别
      

  3.   

    oracle数据库,字段类型为,BLOB,
    10k的时候,正常插入,没有报异常,并且,我测量这个blob的长度,没有丢失数据,当我插入稍大一点的时候就抛出了异常,但是还是做了插入操作,但是这个blob的长度为0.如果手头上装了oracle,可是试试。另外,我对抛出的异常“套节字”不是很熟悉。请指教。
      

  4.   

    二楼提出的建议,我试过了,pstmt1.setBinaryStream(1, fis, (int) fis.available());
    抛出同样的错误。
      

  5.   

    我运行出下面的问题:
    读之前:52797
    连接数据库......
    读之后:52797
    java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
            at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
            at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
            at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.ja
    va)
            at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.jav
    a)
            at oracle.jdbc.driver.OracleStatement.doExecuteWithBatch(OracleStatement
    .java)
            at oracle.jdbc.driver.OracleStatement.doExecute(OracleStatement.java)
            at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStateme
    nt.java)
            at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePrepar
    edStatement.java)
            at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStat
    ement.java)
            at Test.main(Test.java:40)
      

  6.   

    数据库中限制了BLOB字段的最大长度,你可以修改一下。默认为40k左右
      

  7.   

    我在mysql下试了一下,没问题。就是oracle的问题。连接重置了!!
      

  8.   

    我用这种方法结果成功了?楼上的说BLOB默认为40k,我表示怀疑。
    这是我操做成功的代码:
    import java.sql.*;
    import java.io.*;
    import java.util.jar.*;
    import java.util.Enumeration;
    import java.util.zip.*;class JdbcCon{
    String ur ="jdbc:oracle:thin:@192.168.201.200:1521:sdycdev";
    String usr = "sdycdevuser"; 
    public Connection getCon() throws SQLException{
    System.out.println("连接数据库。");
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());  Connection db_con = DriverManager.getConnection(ur,usr,usr); 
    return db_con;
    }
    }
    class Test{

    public static void main(String[] arg) throws SQLException{
    try{
     StringBuffer tokenSet = new StringBuffer();
    String csvfilepath=new String("G:\\zip.zip");  
    addOracleAuthor("12",csvfilepath);
    }catch(Exception ee){}
    }
    public static void addOracleAuthor(String name, String file_photo) {        Connection con = null;
            Statement stmt = null;
            PreparedStatement pstmt=null;
            //File file = null;
            InputStream photoFileStream = null;
            try {
             JdbcCon xx=new JdbcCon();
            
                con = xx.getCon();   //得到Oracle数据库连接
                System.out.println("连接成功!");
                con.setAutoCommit(false);  //注意:要设置为非自动提交的
                //首先执行Insert语句插入一个空的Blob对象
                String insert_sql = "Insert INTO test VALUES(EMPTY_BLOB(),'" + name + "' )";
                stmt = con.createStatement();     
               
                stmt.executeUpdate( insert_sql );                      //执行查询语句取出此记录的Blob对象,注:以UPDATE方式取出
               //String sql = "select filetest from  test where name='" + name + "' FOR UPDATE";
                String sql = "select filetest from  test where name=? FOR UPDATE";
                pstmt=con.prepareStatement(sql);
               pstmt.setString(1,name);
                System.out.println("Execute SQL : " + sql);
                //ResultSet rs = stmt.executeQuery(sql);           
                ResultSet rs = pstmt.executeQuery();
                if (rs.next()) {
                    //得到Blob的二进制对象输出流
                    Blob photoBlob = rs.getBlob(1);
                    OutputStream blob_out = ((oracle.sql.BLOB) photoBlob).getBinaryOutputStream();                //打开图像文件,获得文件输入流
                    File photoFile = new File(file_photo);
                    photoFileStream = new FileInputStream(photoFile);                //从文件流中读取二进制然后写入Blob的输出流
                    byte[] buffer = new byte[10 * 1024];   //设置为10K大小,可能会有关系?未试
                    int nread = 0;   // Number of bytes read
                    while ((nread = photoFileStream.read(buffer)) != -1) // Read from file
                        blob_out.write(buffer, 0, nread);         // Write to Blob                // 关闭文件流和Blob对象流
                    photoFileStream.close();
                    blob_out.close();
                }            //提交数据库连接
                con.commit();
                System.out.println("结束");
            } catch (Exception e) {
                try{ con.rollback();}catch(Exception e2 ){} //回滚
                e.printStackTrace();
            } finally {
                try {
                    if (photoFileStream != null) photoFileStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    if (stmt != null) stmt.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
                try {
                    if (con != null) con.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
        }}