Problema - Carregar imagem do Oracle

3 respostas
napa

Pessoal, alguem poderia me ajudar?

Tenho uma aplicação que pode ser rodada em Oracle e SQL.

Tem uma tela que carrega algumas imagens, porem ele carrega apenas no SQL, ja no Oracle não.

As tabelas são iguais nos 2 bancos, com o mesmo retorno de valor na classe que faz o Select, o que pode estar acontecendo?

Obrigado.

3 Respostas

thiago.correa

Como está os campos que salva a imagem no Oracle?! E o código que salva essa imagem, e o que carrega?! Ela só não carrega ou não grava nada no Db?! Acontece alguma exceção?! É sistema Web ou Desktop?!

napa

Então brother, não é gravação no Oracle, e sim no aplicativo, estou dando um select no oracle pra exibir a imagem na tela.

O SELECT

public class ScannerDAO extends BaseDAO{
	
	//private Connection conn = null;
	Logger log = LogFactory.getQueryLogger();
	private static HashMap iconsMap = null;
	
	/**
	 * Há um mecanismo implementado para a economia de espaço em memória e
	 * banda. Cria-se um array com todos os ícones diferentes que o scanner
	 * possa utilizar e deixa-se residente em memória. Assim, quando houver
	 * um refresh não há a necessidade de ir ao banco outra vez para pegar os
	 * ícones e quando mais de uma linha ou equipamento usam o mesmo ícone,
	 * não se carrega o mesmo ícone mais de uma vez.
	 * @param parmConn
	 * @throws DAOException
	 */
	public ScannerDAO(Connection parmConn) throws DAOException{
		super(parmConn);
		//conn = parmConn;
			if(iconsMap == null)
			iconsMap = obtemIcones();
		}
	
	
	/**
	 * Recupera os diferentes ícones que possam existir na base de dados
	 * e que estejam sendo utilizados.
	 * @return HashMap de ícones
	 * @throws DAOException
	 */
	private HashMap obtemIcones() throws DAOException{
		PreparedStatement ps = null;
		ResultSet rs = null;
		List lista;
		StringBuffer buf = new StringBuffer();
		buf.append(" SELECT \n");
		buf.append("   ICO.IDIcon, \n");
		buf.append("   ICO.Icon \n");
		buf.append(" FROM \n");
		buf.append("   TBLICON ICO \n");
		buf.append(" WHERE \n");
		buf.append("   ICO.IDICON IN (  \n");

		buf.append("     SELECT \n");
		buf.append("   	   DISTINCT(RES.IDIcon)  \n");
		buf.append("     FROM \n");
		buf.append("       TBLResource RES \n");
		buf.append("         inner join TBLIcon ICO \n");
		buf.append("           on RES.IDIcon = ICO.IDIcon \n");
		buf.append("     WHERE RES.FlgEnable = 1 \n");
		buf.append("   )  \n");
		
		try{
			ps = createPStatement(buf.toString());
			rs = executeQuery(ps);
			
			HashMap map = new HashMap();
			String chave;
			ImageIcon icon;


			while(rs.next()){
				chave = rs.getString("idIcon");
				icon = ImageUtil.loadBMPImage(rs.getBytes("Icon"));
				iconsMap.put(chave,icon);
			}
			return iconsMap;
		}catch(Exception e){
			throw new DAOException(e);
		}
	}

O Modulo

/**
	 * Monta a Barra de ferramentas com seus componentes
	 */
	private void inicializaToolBar() {
		btnDlgEquip.setIcon(new ImageIcon(Utils.getImageResource(rb.getString("ScannerMain.image.Equipamentos"))));
		btnDlgEquip.setToolTipText(rb.getString("ScannerMain.tooltip.btnDlgEquip"));
		btnDlgLinhas.setIcon(new ImageIcon(Utils.getImageResource(rb.getString("ScannerMain.image.Linhas"))));
		btnDlgLinhas.setToolTipText(rb.getString("ScannerMain.tooltip.btnDlgLinhas"));
		toolBar.add(btnDlgLinhas);
		toolBar.add(btnDlgEquip);
	}

E um ImageUtil

/**
	 * Le uma imagem no formato BMP e converte para um formato
	 * suportado pela classe ImageIcon (JPEG, GIF, PNG)
	 * @param in
	 * @return
	 * @throws IOException
	 */
	public static ImageIcon loadBMPImage(InputStream in)  {
		try {
			BufferedImage bi = ImageIO.read(in);
			ByteArrayOutputStream  bo = new ByteArrayOutputStream(1000);
			ImageIO.write(bi,"jpeg",bo);
			
			return new ImageIcon(bo.toByteArray());
		}catch(IOException e) {
			e.printStackTrace();
			return null;
		}
	}
Dieval_Guizelini

Eu

tenho usado dessa forma no 10g: para salvar no banco:
OutputStream blobOutputStream = rs.getBinaryOutputStream();     
blobOutputStream.write(buffer, 0, tamanho);       
blobOutputStream.close();
e assim para ler:
while( rs.next() ) {     
    do {     
        qde++;     
        codigo = rs.getString(1);     
        arq = rs.getBlob(2);     
             
        try {     
            // tenta ler o blob     
            bin = arq.getBinaryStream();     
            bytesRead = bin.read(bbuf);     
            // se chegou aqui ta tudo certo...     
        } catch( Exception e ) {     
            // o blob deve estar corrompido     
            psIns.setString(1,codigo);     
            psIns.executeUpdate();     
            log.warning("Blob corrompido: "+codigo);     
        }     
    } while( rs.next() );

Acho que esses links podem te ajudar:

[url]http://forums.sun.com/thread.jspa?threadID=736236&messageID=4249694 [/url]

[url]http://forums.sun.com/thread.jspa?messageID=2522456 [/url]

fw

Criado 5 de junho de 2009
Ultima resposta 5 de jun. de 2009
Respostas 3
Participantes 3