Problema com BLOB

9 respostas
J

Oi pessoal sou novo aqui no fórum e gostaria da ajuda de vocês para resolver esse problema.

Problema:
Estou buscando no banco de dados um campo BLOB e retornando para uma classe e transformando para byte porém é nesse momento que apresenta o erro
Segue o trecho do código e o erro:

O Print que aparece antes do erro: São: CLASSE DO BANCO --> image1=oracle.sql.BLOB@88b1e6 CLASSE do BANCO ---->Byte=[B@578dfb CLASSE que apresenta o erro ---->>> image2:oracle.sql.BLOB@88b1e6
private void acaobotaoconsult2() {
        fun = ControleFuncionario.consultarcadastro(textmatricula.getText());
        if(fun!= null){
            textnomefunc.setText(fun.getNomefun());
            textsetorfunc.setText(fun.getSetfun());
           
                
            try {
                image = (Blob) fun.getBlob();
                System.out.println("image2:"+image);
                imgByte = image.getBytes(1,(int)image.length());
                System.out.println("byte2="+imgByte);
                icon = new ImageIcon(imgByte);
                icon.setImage((Image) fun.getBlob());
                jlabel1.setText("");
                jlabel1.setIcon(icon);
            } catch (SQLException ex) {
                System.out.println("EX:"+ex);
                Logger.getLogger(GerenciamentoVisitantes.class.getName()).log(Level.SEVERE, null, ex);
            }
                
             
        }

erro:
image1=oracle.sql.BLOB@88b1e6
Byte=[B@578dfb
image2:oracle.sql.BLOB@88b1e6
EX:java.sql.SQLRecoverableException: Conexão Fechada
31/01/2012 09:11:34 projeto_portaria.GerenciamentoVisitantes acaobotaoconsult2
SEVERE: null
java.sql.SQLRecoverableException: Conexão Fechada
        at oracle.sql.BLOB.getDBAccess(BLOB.java:1087)
        at oracle.sql.BLOB.length(BLOB.java:151)
        at projeto_portaria.GerenciamentoVisitantes.acaobotaoconsult2(GerenciamentoVisitantes.java:396)
        at projeto_portaria.GerenciamentoVisitantes.actionPerformed(GerenciamentoVisitantes.java:350)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
        at java.awt.Dialog$1.run(Dialog.java:1046)
        at java.awt.Dialog$3.run(Dialog.java:1098)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:1096)
        at java.awt.Component.show(Component.java:1563)
        at java.awt.Component.setVisible(Component.java:1515)
        at java.awt.Window.setVisible(Window.java:842)
        at java.awt.Dialog.setVisible(Dialog.java:986)
        at projeto_portaria.GerenciamentoVisitantes.<init>(GerenciamentoVisitantes.java:129)
        at projeto_portaria.Tela_Inicial.actionPerformed(Tela_Inicial.java:129)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 13 segundos)

Abaixo o trecho do BANCO:

try
        {
            String  comando = ""+func;
            String query ="select b.nomfun, b.nomccu, a.fotemp from r034fot a,usu_vfuncccu b where a.numcad= b.numcad and a.numcad=?";
            result = null;

            stm = con.prepareStatement(query);//prepara o que envia p/ o BD
            stm.setString(1, comando);// seta o ?
            result = stm.executeQuery();//Mostra o resultado da solicitação.
            result.next(); //ele faz com que passe p/ a proxima linha da tabela.
            image   = (Blob) result.getBlob("fotemp"); 
            System.out.println("image1="+image);
            imgByte = image.getBytes(1,(int)image.length());  
            System.out.println("Byte="+imgByte);
             
            return new Funcionario(result.getString("Nomfun"),result.getString("Nomccu"),image);

        }

Agradeço se me ajudar :D

9 Respostas

C

EX:java.sql.SQLRecoverableException: Conexão Fechada

Você está fechando a conexão no momento errado parece, em que momento você fecha a conexão? Pode postar a classe pra gente ver?

J

Obrigado Cristiano por responder, Segue a classe do banco:

package projeto_portaria;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.*;
import oracle.sql.*;
import java.sql.*;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class BDCadastroFunc {
    private static Connection con          =   null;
    private static PreparedStatement stm   =   null;
    private static Statement stmResult     =   null;
    private static ResultSet result        =   null;
    private static String host             =   "jdbc:oracle:thin:@serverdell:1522:dberp";
    private static String user             =   "vetorrh";
    private static String senha            =   "jl85sz21";
    private static ArrayList<Visitante> lista = null;
    private static Blob image;
    private static byte[] imgByte;
     
    
    private static void conectar()
    {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(host,user,senha);
            con.setAutoCommit(false);
        }

        catch(ClassNotFoundException e)
        {
            e.printStackTrace();
        }

        catch(SQLException e)
        {
            
            e.printStackTrace();
        }
    }

    private static void desconectar() 
    {
        try
        {
            con.commit();
            con.close();
            
        }
        catch(SQLException e)
        {
            
            e.printStackTrace();
        }
    }
    public static Funcionario consultarFuncionario(String func){
        conectar();
        try
        {
            String  comando = ""+func;
            String query ="select b.nomfun, b.nomccu, a.fotemp from r034fot a,usu_vfuncccu b where a.numcad= b.numcad and a.numcad=?";
            result = null;

            stm = con.prepareStatement(query);//prepara o que envia p/ o BD
            stm.setString(1, comando);// seta o ?
            result = stm.executeQuery();//Mostra o resultado da solicitação.
            result.next(); //ele faz com que passe p/ a proxima linha da tabela.
            image   = (Blob) result.getBlob("fotemp"); 
            System.out.println("image1="+image);
            imgByte = image.getBytes(1,(int)image.length());  
            System.out.println("Byte="+imgByte);
             
            return new Funcionario(result.getString("Nomfun"),result.getString("Nomccu"),image);

        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
            
        }
        finally
        {
            desconectar();
        }
    }
}
J

Pessoal eu tirei o fechamento da conexão de banco somente para fazer um teste e mudou o erro segue abaixo o mesmo:

a diferença que agora ele recebeu o byte, porem com valor errado, agora mostra que o erro é no recebimento da imagem pelo ImageIcon.

image1=oracle.sql.BLOB@1e940b Byte=[B@189635d image2:oracle.sql.BLOB@1e940b byte2=[B@da9ea4 Exception occurred during event dispatching: java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to java.awt.Image at projeto_portaria.GerenciamentoVisitantes.acaobotaoconsult2(GerenciamentoVisitantes.java:399) at projeto_portaria.GerenciamentoVisitantes.actionPerformed(GerenciamentoVisitantes.java:350) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6263) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1046) at java.awt.Dialog$3.run(Dialog.java:1098) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1096) at java.awt.Component.show(Component.java:1563) at java.awt.Component.setVisible(Component.java:1515) at java.awt.Window.setVisible(Window.java:842) at java.awt.Dialog.setVisible(Dialog.java:986) at projeto_portaria.GerenciamentoVisitantes.<init>(GerenciamentoVisitantes.java:129) at projeto_portaria.Tela_Inicial.actionPerformed(Tela_Inicial.java:129) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) at java.awt.Component.processMouseEvent(Component.java:6263) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

C

Aqui não deu erro, o teu fechamento de conexão parece OK, mas tem duas coisas que quero que você veja:

1ª: Faça um select na tabela pra ver o tamanho dessa coluna BLOB que você quer trazer, mais ou menos assim: SELECT dbms_lob.getlength(a.fotemp), a.* from r034fot a where a.numcad= teu_filtro

2ª: na sua linha que está assim:

Garanta que lá em cima nos imports você esteja utilizando o import “import java.sql.Blob;”, basta passar o mouse em cima deste cast no Blob que aparecerá qual import você está usando caso esteja no eclipse. O import “import oracle.sql.BLOB;” pelo que vi só é usado em caso de UPDATE da coluna BLOB no Oracle.

J

Cristiano consegui resolver da seguinte forma.

1º você tinha razão na questão da conexão ela estava fechando antes.

2º depois percebi que meu trecho estava errado:
icon.setImage((Image) fun.getBlob());
pois somente preciso receber o byte e depois setar tamanho ... então coloquei assim:
try {
                image = (Blob) fun.getBlob();
                System.out.println("image2:"+image);
                imgByte = image.getBytes(1,(int)image.length());
                System.out.println("byte2="+imgByte);
                icon = new ImageIcon(imgByte);
                //icon.setImage((Image) fun.getBlob());
                icon.setImage(icon.getImage().getScaledInstance(200, 200, 100));
                jlabel1.setText("");
                jlabel1.setIcon(icon);
            } catch (SQLException ex) {
                System.out.println("EX:"+ex);
                Logger.getLogger(GerenciamentoVisitantes.class.getName()).log(Level.SEVERE, null, ex);
            }
            finally{
            
                    BDCadastroFunc.fecharconexao();
            }

Cristiano obrigado pela ajuda. :D

C
Juliano Zucatti:
Cristiano consegui resolver da seguinte forma.

1º você tinha razão na questão da conexão ela estava fechando antes.

2º depois percebi que meu trecho estava errado:
icon.setImage((Image) fun.getBlob());
pois somente preciso receber o byte e depois setar tamanho ... então coloquei assim:
try {
                image = (Blob) fun.getBlob();
                System.out.println("image2:"+image);
                imgByte = image.getBytes(1,(int)image.length());
                System.out.println("byte2="+imgByte);
                icon = new ImageIcon(imgByte);
                //icon.setImage((Image) fun.getBlob());
                icon.setImage(icon.getImage().getScaledInstance(200, 200, 100));
                jlabel1.setText("");
                jlabel1.setIcon(icon);
            } catch (SQLException ex) {
                System.out.println("EX:"+ex);
                Logger.getLogger(GerenciamentoVisitantes.class.getName()).log(Level.SEVERE, null, ex);
            }
            finally{
            
                    BDCadastroFunc.fecharconexao();
            }

Cristiano obrigado pela ajuda. :D


Entendi, de nada por nada :). Que bom que resolveu, não era nenhum dos meus palpites kkkkk.

J

Claro que ajudou, me salientando a conexão que eu fechava antes.

hehehe

abraço.

ViniGodoy

Movido para o fórum de persistência. Já que você é novo no fórum, leia com atenção a descrição dos fóruns antes de postar.

J

Ok vini obrigado pelo tok… e desculpa pelo erro.

Abrazz

Criado 31 de janeiro de 2012
Ultima resposta 1 de fev. de 2012
Respostas 9
Participantes 3