Anexar Arquivos no SQL Server com Java

4 respostas
R

Bom dia.

Preciso fazer o seguinte:
Ler de uma base no SQL Server alguns registros, que possuem arquivos de vários formatos (xls, doc, jpg, etc) gravados (Tipo Blob).
E pegar estes arquivos lidos e gravar em outra base SQL Server.

Encontrei alguns tutoriais, mas não consegui fazer nenhum funcionar.

Alguém sabe como?

Obrigada!

Segue abaixo o código que estou tentando usar.

package br.com.vp.bo;

import java.sql.*;   
import java.io.*;   

import javax.naming.NamingException;

import br.com.vp.DAO.ConexaoSQL;
import br.com.vp.vo.PrcAnx;
  
public class BlobInsert   
{   
    public static void main(String[] args) throws SQLException, NamingException, IOException   
    {   
    	InputStream fileBase = null;
    	PrcAnx prcAnx = new PrcAnx();
    	 try   
         {    
   
             byte[] buffer = new byte[32*1024]; // Buffer 32 kb   
   
             Connection conn = ConexaoSQL.obtemConexaoSQL(); 
             System.out.println("Connection Ok!");   
   
             PreparedStatement ps = conn.prepareStatement("select * from PrcAnx where PrcIdt = 355");   
             ResultSet rs = ps.executeQuery();   
   
             if (!rs.next()) {   
                 System.out.println("ID not found!");   
                 return;   
             }   
   
             String fileName = "Arquivo";
             fileBase = rs.getBinaryStream("AnxCnt");   
             prcAnx.setPrcIdt(rs.getInt("PrcIdt"));
             prcAnx.setAnxSeq(rs.getInt("AnxSeq"));
             prcAnx.setAnxDsc(rs.getString("AnxDsc"));
             prcAnx.setAnxCntExt(rs.getString("AnxCntExt"));
             prcAnx.setAnxCntNom(rs.getString("AnxCntNom"));
             prcAnx.setAnxFulPat(rs.getString("AnxFulPat"));
             prcAnx.setAnxDscMem(rs.getString("AnxDscMem"));
             prcAnx.setAnxDttInc(rs.getString("AnxDttInc"));
			 prcAnx.setAnxCodUsuCad(rs.getString("AnxCodUsuCad"));
			 
			 System.out.println("DEPOIS DE SETAR CAMPOS");
				System.out.println("prcIdt.......: " + prcAnx.getPrcIdt());
				System.out.println("anxSeq.......: " + prcAnx.getAnxSeq());
				System.out.println("anxDsc.......: " + prcAnx.getAnxDsc());
				System.out.println("anxCntExt....: " + prcAnx.getAnxCntExt());
				System.out.println("anxCntNom....: " + prcAnx.getAnxCntNom());
				System.out.println("anxFulPat....: " + prcAnx.getAnxFulPat());
				System.out.println("anxDscMem....: " + prcAnx.getAnxDscMem());
				System.out.println("anxDttInc....: " + prcAnx.getAnxDttInc());
				System.out.println("anxCodUsuCad.: " + prcAnx.getAnxCodUsuCad());
             
             OutputStream fileOut = new FileOutputStream(fileName + "." + prcAnx.getAnxCntExt());   
             int bytesLidos = fileBase.read(buffer);   
             while (bytesLidos > 0)   
             {   
                 fileOut.write(buffer, 0, bytesLidos);   
                 bytesLidos = fileBase.read(buffer);   
             }   
             System.out.println("File extracted!");   
         }   
         catch (Exception e)   
         {   
             e.printStackTrace(System.out);   
         }   
         
    	  	
        try   
        {    
  
            File fileDesc = new File(prcAnx.getAnxCntNom());   
            InputStream file = fileBase;  
            
            System.out.println("prcIdt.......: " + prcAnx.getPrcIdt());
			System.out.println("anxSeq.......: " + prcAnx.getAnxSeq());
			System.out.println("anxDsc.......: " + prcAnx.getAnxDsc());
			System.out.println("anxCntExt....: " + prcAnx.getAnxCntExt());
			System.out.println("anxCntNom....: " + prcAnx.getAnxCntNom());
			System.out.println("anxFulPat....: " + prcAnx.getAnxFulPat());
			System.out.println("anxDscMem....: " + prcAnx.getAnxDscMem());
			System.out.println("anxDttInc....: " + prcAnx.getAnxDttInc());
			System.out.println("anxCodUsuCad.: " + prcAnx.getAnxCodUsuCad());
   
            Connection conn = ConexaoSQL.obtemConexaoSQL();
              
            PreparedStatement ps = conn.prepareStatement("insert into PrcAnx2 (PrcIdt, AnxSeq, AnxDsc, AnxCnt, AnxCntExt, AnxCntNom, AnxFulPat, AnxDscMem, AnxDttInc, AnxCodUsuCad, msrepl_tran_version) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NEWID())");   
            ps.setInt(1, prcAnx.getPrcIdt());
            ps.setInt(2, prcAnx.getAnxSeq());
            ps.setString(3, prcAnx.getAnxDsc());
            ps.setBinaryStream(4, file, (int) fileDesc.length());
            ps.setString(5, prcAnx.getAnxCntExt());
            ps.setString(6, prcAnx.getAnxCntNom());
            ps.setString(7, prcAnx.getAnxFulPat());
            ps.setString(8, prcAnx.getAnxDscMem());
            ps.setString(9, prcAnx.getAnxDttInc());
            ps.setString(10, prcAnx.getAnxCodUsuCad());
            
            ps.executeUpdate();   
  
            System.out.println("File saved!");   
        }   
        catch (Exception e)   
        {   
            e.printStackTrace(System.out);   
		}
    }   
}

4 Respostas

fabiocsilva

Pode mapear assim(com campo image no SQL Server) no Hibernate:

@Column(name="myFile",columnDefinition="image",nullable=true)
private Blob myFile; //getter e setter
R

Na verdade assim, não sei se tem como fazer isso…

Mas eu não queria que o arquivo lido da base antiga fosse gravado em disco. Eu queria mante-lo em um objeto, e utilizar este objeto pra fazer a inserção na base nova, sem ter que inserir nada em disco, entendeu?

Será que tem como fazer isso?

ribclauport

Qual o erro?

Ja pensou em declarar um campo static em deixar seu Stream neste campo?
quando precisar pega deste campo e grava...

poderia deixar armazenado em um Map...

quando precisar gravar é so buscar arquivo.get(id); desta forma os dados ficariam em memória,

tipo:

package Teste;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class Exemplo {
	static Map<String, InputStream> arquivo = new HashMap<String, InputStream>();

	public void exemplo() throws IOException {
		InputStream fileBase = new FileInputStream("viriabobanco.txt");
		byte[] buffer = new byte[32 * 1024];
		fileBase.read(buffer);
		arquivo.put("chave", fileBase);

	}
	
	

}
fabiocsilva

raquelNicolau:
Na verdade assim, não sei se tem como fazer isso…

Mas eu não queria que o arquivo lido da base antiga fosse gravado em disco. Eu queria mante-lo em um objeto, e utilizar este objeto pra fazer a inserção na base nova, sem ter que inserir nada em disco, entendeu?

Será que tem como fazer isso?

Você vai ler o arquivo de uma base e inserir na outra como se fosse um campo blob qualquer, tanto faz mapeado via Hibernate ou RecordSet.

Blob b = rs.getBlob("myFile");
Criado 23 de fevereiro de 2012
Ultima resposta 23 de fev. de 2012
Respostas 4
Participantes 3