使用JDK自带的JDBC-ODBC驱动对Access进行BLOB字段读写

原创 2006年06月08日 04:50:00
 
MS Access在测试阶段比较利于携带,Web开发初期我经常使用它。后期再移植到SQLServer或Oracle上。但最近在需要对数据库中插入图片文件时,发现了一个问题,即JDK自带的JDBC-ODBC不支持java.sql.Blob里的方法,经过查阅Java API和程序调试,我找到了个变通的方法,即:
1,在写入BLOB类型字段时,使用java.sql.PreparedStatement的setBinaryStream方法,
2,读出BLOB类型字段时,因为返回的是字节数组byte[]类型,可以把它转换成ByteArrayInputStream然后读出内容写到文件里去。
这样即使用JDK自带的JDBC-ODBC驱动, 也能自如的在数据库里读写上传下载的文件了,哈哈。
代码如下:
import java.sql.*;
import java.io.*;
//对BLOB字段先写入(要求被写入的文件存在),再读出来
//要求先建立一个item表,有三个字段,id(int),file_name(char),file_blob(blob)
//对Access, blob字段应该设置成为“OLE对象”类型
 
public class blobtest{
 
    public static void main(String[] args){
        Connection conn = null;
        try{
   
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            /*这里的数据库的url一定要写正确,这是关键,其中DBQ可以绝对路径,也可以是相对路径,为了体现数据存储路径的/独立性,你可以将数据库copy到不同的位试一下*/
            String dbUrl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=blob.mdb";
            conn = DriverManager.getConnection(dbUrl,"","");
           
            File file1=new File("fileToWrite.doc");   
            File file2=new File("fileRead.doc");
   
            //BlobWriteForOracle( conn, file1);
            //BlobReadForOracle( conn, file2);
            BlobWriteForAccess( conn, file1);
            BlobReadForAccess( conn, file2);
 
            conn.close();
           
        }catch(Exception ex){
            System.err.println(ex.getMessage());
        }             
       
    }
 
    public static void BlobWriteForAccess( Connection conn, File file){
   
        try{
            conn.setAutoCommit(false); // 取消Connection对象的auto commit属性
            String file_name=file.getName();
           
            // get maxid ( to avoid insert id repeatly )
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("select max(id) from item");
            rs.next();
            int maxid = rs.getInt(1);
            //maxid = (maxid==null)?0:maxid;
           
            int id = maxid+1 ;
            //System.out.println("write_id="+id);
           
            PreparedStatement pstmt = conn.prepareStatement( "insert into item ( id, file_name, file_blob ) values ( " + id + ", ? , ? )" );
            FileInputStream in = new FileInputStream(file );
            int length = in.available();
           
            pstmt.setString( 1, file_name );
            pstmt.setBinaryStream( 2, in , in.available() );
           
            System.out.println( "插入了 "+ pstmt.executeUpdate ()+ " 行数据, "
                                 + "id =" + id
                                 + ", 文件名是" + file.toString() +" , 共 "+ length +" bytes" );
 
            conn.commit();
            pstmt.close();
 
        }catch(Exception ex){
            ex.printStackTrace();
            System.out.print("["+ex.getMessage()+"]");
            try{
                conn.rollback();
            }catch(SQLException sqle){
                System.err.println(sqle.getMessage());
            }
        }   
   
    }
   
    public static void BlobReadForAccess( Connection conn, File file){
   
        try{
            conn.setAutoCommit(false); // 取消Connection对象的auto commit属性
            String file_name=file.getName();
           
            // get maxid ( to avoid insert id repeatly )
            Statement stmt1 = conn.createStatement();
            ResultSet rs1 = stmt1.executeQuery("select max(id) from item");
            rs1.next();
            int maxid = rs1.getInt(1);
            //maxid = (maxid==null)?0:maxid;
                       
            int id = maxid;
            //System.out.println("read_id="+id);
           
            String sql="SELECT file_blob FROM item WHERE id=" + id + ""; //
            Statement stmt=conn.createStatement();
            ResultSet rs=stmt.executeQuery(sql);
            rs.next();
            Object obj1 = rs.getObject("file_blob"); // 得到BLOB对象
            //System.out.println("type is :"+obj1.getClass().getName());
            byte[] blob=(byte[])obj1;
           
            FileOutputStream out=new FileOutputStream(file); // 建立输出流
            ByteArrayInputStream in=new ByteArrayInputStream(blob); // 建立输入流
           
            int size=1024;
            byte[] buffer=new byte[size]; // 建立缓冲区
            int len;
            while((len=in.read(buffer)) != -1)
                out.write(buffer,0,len);
            in.close();
            out.close();
           
            conn.commit();
        }catch(Exception ex){
            ex.printStackTrace();
            System.out.print("["+ex.getMessage()+"]");
            try{
                conn.rollback();
            }catch(SQLException sqle){
                System.err.println(sqle.getMessage());
            }
        }   
   
    }   
 
}
(本文为yanqlv原创,转载请注明出处,谢谢)
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA 取 数据库里Blob字段值为字符串的方法

JAVA 取 数据库里Blob字段值为字符串的方法 java.sql.Blob blob = rs.getBlob(2); InputStream in=blob.getBinaryStre...
  • zhq426
  • zhq426
  • 2012-11-20 17:49
  • 3800

多层数据库应用基于Delphi DataSnap方法调用的实现(四)BLOB字段的读写

数据库的BLOB字段,可以用来保存字节流数据,比如图片、声音文件、html文档和大文本等等。Delphi传统的DataSnap技术,客户端数据集的数据包缺省不包含Blob字段数据,但可以在真正需要的时...
  • ddqqyy
  • ddqqyy
  • 2011-07-30 17:16
  • 3806

Java读写Blob和Clob字段源码

Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdb...

对oracle中BLOB字段读写的总结

对oracle中BLOB字段读写的总结   最近两天,阿堂在处理将页面中的文件上传和下载时,要将页面上,客户选择的任意类型上传的文件,写入到oracle中的BLOB类型的字段中,同时,客户...

多层数据库应用基于Delphi DataSnap方法调用的实现(四)BLOB字段的读写

[转]多层数据库应用基于Delphi DataSnap方法调用的实现(四)BLOB字段的读写 数据库的BLOB字段,可以用来保存字节流数据,比如图片、声音文件、html文档和大文...

oracle中读写blob字段的问题解析

LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对像(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图像、影音等)。而CLOB,即字符型大型对像(Chara...

java读写Oracle Blob字段

前几天一直在研究Oracle Text,其中用到了Blob类型,如果用过Oracle数据库并且用Blob类型存储文件(word, excel,txt…)的同学来说,肯定不陌生了。现在就做个笔记。 B...

多层数据库应用基于Delphi DataSnap方法调用的实现(四)BLOB字段的读写

数据库的BLOB字段,可以用来保存字节流数据,比如图片、声音文件、html文档和大文本等等。Delphi传统的DataSnap技术,客户端数据集的数据包缺省不包含Blob字段数据,但可以在真正需要的时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)