从oracle中导出数据到access中,以mdb格式导出文件

@Override
	public void exportMdbData(Invocation inv, Long taId, Paging page) throws Exception {
		
	    //设置表名   
	    String tablename1="tb_09as0y4kyet2";
	    
	    // 空白mdb文件路径. 直接保存在src/cn/iwoo/dataexport/common/下.   
	    String blankMdbFilePath = "com/lzzj/prodma/controllers/archives/";   
	    // 空白mdb文件名   
	    String blankMdbFileName = "123.mdb";   
	    
	    // 新mdb文件路径   
	    String defaultSavedMdbFilePath = "com/lzzj/prodma/controllers/archives/";   
	    // 新mdb文件名   
	    String defaultSavedMdbFileName = "data.mdb";   
	    // mdb文件后缀   
	    String defaultSavedMdbFileExtension = ".mdb";   
	    
	    // 需要保存到的新的mdb文件路径和名   
	    String savedMdbFilePathAndName = defaultSavedMdbFilePath + defaultSavedMdbFileName;   
	    
	    //将空白mdb文件拷贝到特定目录
	    InputStream is = this.getClass().getClassLoader().getResourceAsStream(blankMdbFilePath + blankMdbFileName);   
	    savedMdbFilePathAndName=getClass().getClassLoader().getResource("/").getPath()+savedMdbFilePathAndName;
        OutputStream out = new FileOutputStream(savedMdbFilePathAndName);   
        byte[] buffer = new byte[1024];   
        int numRead;   
        while ((numRead = is.read(buffer)) != -1) {   
            out.write(buffer, 0, numRead);   
        }   
        is.close();   
        out.close();  
        
        //开始从oracle取数据
        Connection conn =null;
        PreparedStatement ps=null;
        ResultSet rs =null;
        String createTableSql1="";//一个建表语句
        Map map1=new HashMap();//一个map存一个表的字段
        List<Map> list1 = new ArrayList<Map>();//一个list存一个表的记录
        int mapSize1=0;//一个表的字段个数
        String value="";//用于拼接sql
        try{
        	
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.3.157:1521:ORCL", "pde", "pde");
            map1=getCols(conn,ps,rs,tablename1);//map中存有该表中的所有字段
            mapSize1=map1.size();
            //拼接access中的建表sql语句
            createTableSql1=createTableSql(tablename1,map1);//建表sql
            
            String sql2="select * from "+tablename1;//提取ORACLE表数据的sql
            ps = conn.prepareStatement(sql2);
            rs = ps.executeQuery();
            String aa="";
            String bb="";
            while (rs.next()) {
            	Map dateMap=new HashMap();//一条记录一个dateMap
            	for(int z=1;z<=mapSize1;z++){
            		aa=String.valueOf(map1.get(z+""));
            		bb=rs.getString(z)==null?"":rs.getString(z);
            		dateMap.put(aa, bb);
            	}
            	list1.add(dateMap);
            }
          //结束从oracle取数据
        }catch(Exception e){
        	e.printStackTrace();
        }finally{
        	 // 关闭记录集
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            // 关闭声明
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            // 关闭链接对象
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        
        //打开对mdb文件的jdbc-odbc连接
        Connection connection=null;   
	    Statement statement=null;  
        try{
        	
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
            String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+ savedMdbFilePathAndName.substring(1).trim(); //, *.accdb
            connection = DriverManager.getConnection(database);  
            statement = connection.createStatement();   

            statement.execute(createTableSql1);   //创建ACCESS表sql
            String insertSql="";
            int listSize=list1.size();
            //拼接access中的insert语句
            for(int x=0;x<listSize;x++){
            	insertSql="insert into "+tablename1+" values(";
            	for(int k=1;k<=mapSize1;k++){
                	value=String.valueOf(list1.get(x).get(map1.get(k+"")));
                	if(k==mapSize1){
                		insertSql+="'"+value+"');";
                	}else{
                		insertSql+="'"+value+"',";
                	}
                	
                }
            	statement.execute(insertSql);
            }
            //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型  
            inv.getResponse().setContentType("multipart/form-data");  
            //2.设置文件头:最后一个参数是设置下载文件名(假如我们叫data.mdb)  
            inv.getResponse().setHeader("Content-Disposition", "attachment;fileName="+"data.mdb");  
            File file = new File(savedMdbFilePathAndName);
            OutputStream out1;  
            FileInputStream inputStream = new FileInputStream(file);  
          //3.通过response获取ServletOutputStream对象(out)  
            out1 = inv.getResponse().getOutputStream(); 
            try {  
                
                int b = 0;  
                byte[] buffer1 = new byte[8192];  
                while (b != -1){  
                    b = inputStream.read(buffer1);  
                    //4.写到输出流(out)中  
                    out1.write(buffer1,0,b);  
                }  
      
            } catch (IOException e) {  
                e.printStackTrace();  
            }finally{
            	out1.flush();
                inputStream.close();  
                out1.close();  
                file.delete();
            }  
        }catch(Exception e){
        	e.printStackTrace();
        }finally{
        	// 关闭声明
        	if (statement != null) {
                try {
                	statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        	//关闭连接
            if (connection != null) {
                try {
                	connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        
	}
	
	public Map getCols(Connection conn,PreparedStatement ps,ResultSet rs,String tableNmae) throws SQLException{//获取某张表中的所有字段
        Map map=new HashMap();

        String sql1="select  COLUMN_NAME from user_tab_cols where table_name=upper('"+tableNmae+"') order by column_id";//获取该表中的所有字段
        ps = conn.prepareStatement(sql1);
        rs = ps.executeQuery();
        
        int j=0;
        
        while (rs.next()) {
        	j++;
        	map.put(j+"", rs.getString(1));//存表中的所有字段
        }
        
        return map;
	}
	
	public String createTableSql(String tableNmae,Map map){
		String createTableSql="CREATE TABLE "+tableNmae+" ( ";
        int mapSize=map.size();//字段个数
        String value="";
        for(int k=1;k<=mapSize;k++){
        	value=String.valueOf(map.get(k+""));
        	if(k==mapSize){
        		createTableSql+=value+" Memo );";
        	}else{
        		createTableSql+=value+" Memo ,";
        	}
        	
        }
		return createTableSql;
	}
封装的方法比较笨,待优化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值