源码如下:// Package for JDBC classes
import java.sql.*;
import oracle.jdbc.pool.OracleDataSource;// Java Utility Classes
import java.util.*;// Package for using Streams
import java.io.*;public class File2DB{ private String driver="oracle.jdbc.driver.OracleDriver";
private String url="jdbc:oracle:thin:@10.0.0.14:1521:cert";
private String username="certuser";
private String password="certuser";
private String tableName="ApplymentDatum";
private String columnName="ImgPicture";
private String handle="1";

protected boolean fileToDB(File file){
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password);
con.setAutoCommit(false);
PreparedStatement pstmt=con.prepareStatement("select "+columnName+" from "+tableName+" where oid="+handle); 
ResultSet rs=pstmt.executeQuery();
rs.next();
Blob imgBlob=rs.getBlob(columnName);
OutputStream imgBlobOut = ((oracle.sql.BLOB)imgBlob).getBinaryOutputStream();
InputStream is=new FileInputStream(file);
byte[] buf = new byte[10*1024];
int lenread = 0;
while ((lenread= is.read(buf)) != -1){ 
imgBlobOut.write(buf,0,lenread);
}
con.commit();
imgBlobOut.close();
rs.close();
pstmt.close(); 
is.close();
con.close();
return true;
}
catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
return false;
}

public static void main(String[] args){
String filepath="";
File file=null;
if(args.length!=1){
System.out.println("please give filepath,usage:java File2DB filepath.");
return;
}
filepath=args[0];
try{
file=new File(filepath);
}
catch(Exception e){}
File2DB f=new File2DB();
if(!f.fileToDB(file))System.out.println("insert file to DB fail");

}
}

解决方案 »

  1.   

    你用的是一条select语句怎么能写数据库呢?要是写应该用update或insert啊,还有你的PreparedStatement 用法不对。
      

  2.   

    类似如下:
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.io.*,java.util.*,java.sql.*,java.text.*,oracle.jdbc.driver.*,oracle.sql.*" %><HTML><HEAD>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"><link rel="STYLESHEET" type="text/css" href="css/style.css">
    <TITLE>发文--保存</TITLE><script language="javascript">
    </script>
    </HEAD>
    <jsp:useBean id="writeBeanId" scope="session" class="newhua.writeBean" />
    <jsp:setProperty name="writeBeanId" property="*" /><BODY  BGCOLOR=#CCCCc2 TEXT=#0f0000 LINK=#0000ff ALINK=#cc0000 VLINK=#306898 TOPMARGIN=5 MARGINHEIGHT="5" >
    <%!
    public static String UnicodeToChinese(String s){
      try{
         if(s==null||s.equals("")) return "";
         String newstring=null;
         newstring=new String(s.getBytes("ISO8859_1"),"gb2312");
         return newstring;
        }
      catch(UnsupportedEncodingException e)
      {
      return s;
      }
      }%>
    <%
    String glidenumber,comenumber,author,editor,buildtime,subject,flag;glidenumber=UnicodeToChinese(request.getParameter("glidenumber")) ;
    comenumber=UnicodeToChinese(request.getParameter("comenumber")) ;
    author=UnicodeToChinese(request.getParameter("author")) ;
    editor=UnicodeToChinese(request.getParameter("editor")) ;
    buildtime=UnicodeToChinese(request.getParameter("buildtime")) ;
    subject=UnicodeToChinese(request.getParameter("subject")) ;
    flag=UnicodeToChinese(request.getParameter("flag")) ;String mysql;
    mysql="INSERT INTO SYSTEM.TMANUSCRIPT (COMENUMBER ,GLIDENUMBER ,AUTHOR ,FLAG ,EDITOR ,BUILDTIME,SUBJECT,WORD  )";
    mysql=mysql+"  VALUES ('"+comenumber+"' ,'"+glidenumber+"' ,'"+author+"' ,'"+flag+"' ,'"+editor;
    mysql=mysql+" ' ,'"+buildtime+" ' ,'"+subject+"' ,EMPTY_BLOB() )";out.println(mysql);
    newhua.dbbean  db=new newhua.dbbean();
    db.executeSql(mysql);String filename="c:/lsdoc/"+glidenumber+".sxw";
    writeBeanId.setFilename(filename);
    writeBeanId.setSample(glidenumber);
    System.out.println(filename);
    System.out.println(glidenumber);
    writeBeanId.gwrite() ;response.sendRedirect("search.jsp");
    %></BODY>
    </HTML>
      

  3.   

    to: xue_sharp(你是自愿被我泡的)
    我是向oracle中的Blob字段写东西,普通的insert\update应该是没有用的。
    我偿试了用preparedstatement,用setBianryStream往里写,也是没效果,不知为什么?
      

  4.   

    你用于处理方法的话,可以用?代替与插入的字段,然后可以用preparedstatement的setXXX方法来实现BOLB的写入。
    你的代码好像没什么错误
      

  5.   

    我把:
    PreparedStatement pstmt=con.prepareStatement("select "+columnName+" from "+tableName+" where oid="+handle); 
    语句改为:
    PreparedStatement pstmt=con.prepareStatement("select "+columnName+" from "+tableName+" where oid="+handle+" for update");
    之后,报错为:ORA-01002: 读取违反顺序java.sql.SQLException: ORA-01002: 读取违反顺序 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:169)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)
    at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:889)
    at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:1826)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2015)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:395)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:339)
    at File2DB.fileToDB(File2DB.java:29)
    at File2DB.main(File2DB.java:66) 
      

  6.   

    File2DB是我的java类,
    29行为:ResultSet rs=pstmt.executeQuery();
      

  7.   

    主要是在执行插入操作时
    PreparedStatement ps =conn.prepareStatement("insert into tfile(id,filename,info) values(?,?,empty_blob())");
    调用empty_blob()对blob字段进行初始化请参看下代码其它细节问题我都写了注释!<%@page contentType="text/html;charset=gb2312"%>
    <%@ page import="java.sql.*" %>
    <%@ page import="java.io.*" %>
    <%@ page import="java.util.*" %>
    <%@page import="oracle.sql.*,oracle.jdbc.driver.*" %><HTML>
    <BODY BGCOLOR="white"><H1>jspSmartUpload : Sample 4</H1>
    <HR><%
    // Connect to the database Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   
    String url="jdbc:oracle:thin:@172.18.16.68:1521:rz817"; 
    //orcl为你的数据库的SID 
    String user="hr_system"; 
    String password="manager"; 
    Connection conn= DriverManager.getConnection(url,user,password);   

    conn.setAutoCommit(false);
    PreparedStatement ps =conn.prepareStatement("insert into tfile(id,filename,info) values(?,?,empty_blob())");
    ps.setLong(1,1);
    java.io.File filename=new java.io.File("e:/img.jpg");
    ps.setString(2,filename.getName());
    ps.executeUpdate();
    ps.close();

    Statement stmt = conn.createStatement();
    //定位到刚才插入的记录
    ResultSet rs = stmt.executeQuery("select info from tfile where id=1");
    if (rs.next()) {
       //更新BLOB字段,需要注意的是,这里使用的是Oracle的JDBC驱动中的类
       //oracle.sql.BLOB;并且,Resultset需要强制转换为类型
       //Oracle.jdbc.OracleResultSet
       BLOB mybl = ((OracleResultSet)rs).getBLOB(1);
      //获得BLOB字段的写入流
       OutputStream out1 = mybl.getBinaryOutputStream();
       FileInputStream inf = new FileInputStream(filename);
       byte[] buffer = new byte[4096];
       int length = -1;
       //读入文件输入流,并写入BLOB写入流中
       while ((length = inf.read(buffer)) != -1)  
         out1.write(buffer,0,length);
         //关闭输入输出流
       inf.close();
       out1.close();
    }
    //关闭相关资源
    rs.close();
    stmt.close();
    //提交更新
    conn.commit();
    %>
    </BODY></HTML>
      

  8.   

    pstmt=con.prepareStatement("select "+columnName+" rom "+tableName+" where oid="+handle); pstmt=con.prepareStatement("select "+columnName+" rom "+tableName+" where oid='"+handle + "'");
      

  9.   

    my suggestion:
    first, you should use preparestatement 
    second, if you want to insert into blob and cannot input the content, you had better use ps.setBinaryStream
    lastly, if you want to read from resultSet, getBlob is a prefered method.
      

  10.   

    插一条记录,LOB字段为空
    然后根据主键更新该记录
    似乎一定要只能选到一条记录,才能更新该记录LOB字段
    放在循环里就会出上面的错
      

  11.   

    <br>
    just write some word in IE
    <br>
    <%@ page language = "java" %>
    <%@ page import="java.util.*"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="oracle.sql.*"%>
    <%@ page import="java.io.*"%>
    <%@ page contentType="text/html;charset=gb2312" %><%
        try {
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   
    String url="jdbc:oracle:thin:@133.166.200.73:1521:ora73"; 
    String user="asset"; 
    String password="asset"; 
    Connection con= DriverManager.getConnection(url,user,password);   
        con.setAutoCommit(false);    //*
    String sql = "insert into sandwichtest values('00000013', empty_clob(), empty_blob())";
        Statement stmt = con.createStatement();
    stmt.executeUpdate(sql);
        con.commit();            //*
    sql = "select blobimage from sandwichtest where id='00000013' for update";
        ResultSet rs = stmt.executeQuery(sql);
    if (rs.next()) { //·&frac12;·¨&para;&thorn;
    File file = new File("D:\\bea\\wlserver6.1\\config\\mydomain\\applications\\DefaultWebApp\\note.gif");
    InputStream fis = new FileInputStream(file);         oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("blobimage");
    System.out.println(fis.available());
    PreparedStatement ps = 
    con.prepareStatement("update sandwichtest set blobimage=? where id='00000013'");
    ps.setBinaryStream(1,fis,fis.available());
    ps.executeUpdate();
    ps.close();
    fis.close(); }
    con.commit();
    rs.close(); }
    catch (Exception e) {
    System.out.println(e.getMessage());
    }
    %>
      

  12.   

    给你一个关于大队向操作的实例,我这还没弄完全,等以后什么都弄懂了,我会将其公布给大家的。下面的只是我的一个关于大对象的一些操作的测试用的bean,其中有关于BLOB,CLOB,long raw的操作,每一个都成功执行过。
    package mshtang.large;
    import java.sql.*;
    import java.io.*;
    import oracle.sql.*;
    import oracle.jdbc.driver.*;
    import mshtang.html.DatabaseForHtml;
    public class LargeObjectAction
    {
      public void orablob()
      {
      }
      public static void insertblob()
      {
        try
        {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          String dbURL = "jdbc:oracle:thin:@192.168.0.74:1521:orcl";
          String user = "pm";
          String passWord = "pm";
          Connection conn = DriverManager.getConnection(dbURL, user, passWord);
          conn.setAutoCommit(false);
          Statement stmt = conn.createStatement();      DatabaseForHtml sqlBean = new DatabaseForHtml();
          String sqlStr = "";
          String fileName = "";
          String displayMessage = "";
          try
          {
            sqlStr = "select table_name from user_tables where table_name='JPGTEST'";
            if(!sqlBean.hasResult(conn, sqlStr))
            {
              displayMessage = (stmt.executeUpdate("create table JPGTEST (fname varchar2(600), bx blob)") == 0) ? "table created successfuly" : "table created failure";
              System.out.println(displayMessage);
            }
            File file = new File("C:\\06.jpg");
            fileName = file.getName();
            FileInputStream inStream = new FileInputStream(file
            byte[] buffer = new byte[inStream.available()];
            sqlStr = "INSERT INTO JPGTEST VALUES ('" + fileName + "', empty_blob())";
            stmt.execute(sqlStr);
            ResultSet rs = stmt.executeQuery("select bx from JPGTEST where fname='" + fileName + "' for update");
            if(rs.next())
            {
              BLOB blob = ((OracleResultSet)rs).getBLOB("bx");
              OutputStream outStream = blob.getBinaryOutputStream();
              inStream.read(buffer);
              outStream.write(buffer);
              outStream.flush();
              stmt.execute("commit");
              outStream.close();
              System.out.println("文件成功写入数据库");
            }
            inStream.close();
            rs.close();
          }
          catch(SQLException e)
          {
            e.printStackTrace();
            System.out.println("数据库异常:" + e.getMessage());
          }
          //以下是从库中读取文件。
          sqlStr = "SELECT * from JPGTEST where fname='" + fileName + "'";
          System.out.println(sqlStr);
          ResultSet rset = stmt.executeQuery(sqlStr);
          if(rset.next())
          {
            BLOB blob = ((OracleResultSet)rset).getBLOB("bx        InputStream inStream = blob.getBinaryStream();
            File binaryFile = new File("D:\\test\\" + fileName);
            FileOutputStream fileOutStream = new FileOutputStream(binaryFile);
            int by = inStream.read();
            while(by != -1)
            {
              fileOutStream.write(by);
              by = inStream.read();
            }
            fileOutStream.flush();
            System.out.println("文件从数据库中成功读出");
            inStream.close();
            fileOutStream.close();
          }
          rset.close();
          stmt.close();
          conn.close();
        }
        catch(Exception ee)
        {
          System.out.println(ee.getMessage());
        }
      }
      
      

  13.   

    续:
      public static void insertLongRow()
      {
        try
        {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          String dbURL = "jdbc:oracle:thin:@192.168.0.74:1521:orcl";
          String user = "pm";
          String passWord = "pm";
          Connection conn = DriverManager.getConnection(dbURL, user, passWord);
          conn.setAutoCommit(false);
          Statement stmt = conn.createStatement();
          DatabaseForHtml sqlBean = new DatabaseForHtml();
          String sqlStr = "";
          String fileName = "";
          String displayMessage = "";
          try
          {
            sqlStr = "select table_name from user_tables where table_name='rowTestTable'";
            if(!sqlBean.hasResult(conn, sqlStr))
            {
    //          displayMessage = (stmt.executeUpdate("create table rowTestTable(fileName varchar2(50), detail long raw)") == 0) ? "table created successfuly" : "table created failure";
    //          System.out.println(displayMessage);
            }
            File file = new File("C:\\06.jpg");
            fileName = file.getName();
            FileInputStream inStream = new FileInputStream(file);
            PreparedStatement pstmt = conn.prepareStatement("insert into rowTestTable values('" + fileName + "', ?)");
            pstmt.setBinaryStream (1, inStream, (int)file.length());
            if(pstmt.executeUpdate() == 1)
            {
              System.out.println("ok");
            }
            else
            {
              System.out.println("bad");
            }
            inStream.close();
          }
          catch(SQLException e)
          {
            e.printStackTrace();
            System.out.println("数据库异常:" + e.getMessage());
          }
          //以下是从库中读取文件。
          sqlStr = "SELECT * from rowTestTable where fileName='" + fileName + "'";
          System.out.println(sqlStr);
          ResultSet rset = stmt.executeQuery(sqlStr);
          if(rset.next())
          {
    //        BLOB blob = ((OracleResultSet)rset).getBLOB("bx");
            InputStream inStream = rset.getBinaryStream("detail");
            File binaryFile = new File("D:\\test\\1" + fileName);
            FileOutputStream fileOutStream = new FileOutputStream(binaryFile);//创建文件输出流。
            int by = inStream.read();
            while(by != -1)
            {
              fileOutStream.write(by);
              by = inStream.read();
            }
            fileOutStream.flush();
            System.out.println("文件从数据库中成功读出");
            inStream.close();//关闭流
            fileOutStream.close();
          }
          rset.close();
          stmt.close();
          conn.close();
        }
        catch(Exception ee)
        {
          System.out.println(ee.getMessage());
        }
      }  public static void testCLOB()
      {
        StringBuffer sb = new StringBuffer("");
        String testChar = "测试CLOB操作,";
        for(int i = 0; i < 1000; i++)
        {
          sb.append(testChar);
        }
        testChar = sb.toString();
        //首先是将文件输入到数据库。
        try
        {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          String dbURL = "jdbc:oracle:thin:@192.168.0.74:1521:orcl";
          String user = "pm";
          String passWord = "pm";
          Connection conn = DriverManager.getConnection(dbURL, user, passWord);
          conn.setAutoCommit(false);
          Statement st = conn.createStatement();
          String sqlStr = "insert into test (id0000, clobvalue) values ('1000000112', empty_clob())";
          st.executeUpdate(sqlStr);
          sqlStr = "select clobvalue from test where id0000='1000000112' for update";
          ResultSet rs = st.executeQuery(sqlStr);
          if(rs.next())
          {
            try
            {
              CLOB clob = ((OracleResultSet)rs).getCLOB("clobvalue");
              Writer writer = clob.getCharacterOutputStream();
              byte[] buffer = testChar.getBytes("GBK");
              InputStream inStream = new ByteArrayInputStream(buffer);
              Reader reader = new InputStreamReader(inStream, "GBK");
              int by = reader.read();
              while(by != -1)
              {
                writer.write(by);
                by = reader.read();
              }
              writer.flush();
              writer.close();
              reader.close();
              conn.commit();
              System.out.println("success");
              sqlStr = "select clobvalue from test where id0000='1000000112'";
              rs = st.executeQuery(sqlStr);
              String testCLOB = "";
              if(rs.next())
              {
                CLOB clob2 = ((OracleResultSet)rs).getCLOB("clobvalue");
                Reader reader2 = clob2.getCharacterStream();
                BufferedReader bfReader = new BufferedReader(reader2);
                String test = "";
                while((test = bfReader.readLine()) != null)
                {
                  testCLOB += test + "\n";
                }
                FileWriter fileWriter = new FileWriter("c:\\testCLOB7.doc");
                buffer = testCLOB.getBytes("GBK");
                Reader reader3 = new InputStreamReader(new ByteArrayInputStream(buffer), "GBK");
                by = reader3.read();
                while(by != -1)
                {
                  fileWriter.write(by);
                  by = reader3.read();
                }
                fileWriter.flush();
                fileWriter.close();
                reader3.close();
                System.out.println("成功写入文件");
              }
            }
            catch(Exception e)
            {
              e.printStackTrace();
            }
          }
        }
        catch(ClassNotFoundException e)
        {
          e.printStackTrace();
        }
        catch(SQLException e)
        {
          e.printStackTrace();
        }  }
      public static void main(String args[])
      {
        insertblob();
        insertLongRow();
        testCLOB();
      }
    }
      

  14.   


    楼主,我的信箱是:[email protected]
    我做成功了!一直在用,存取图片!
    好象用BLOL字段有点问题,我用的LONG RAW类型!
      

  15.   

    对不起打错了:BLOB不是很好用!
      

  16.   

    你必须用DBMS_BLOB包的功能处理BLOB字段!