AWT-EventQueue-0 - ClassCastException?

30 respostas
S

Gente … o que é esta msg que apareceu em minha tela ??? Alguém já teve ?

Exception in thread AWT-EventQueue-0 java.lang.ClassCastException: javax.sql.rowset.serial.SerialBlob

at oracle.jdbc.driver.OraclePreparedStatement.setBlob(OraclePreparedStatement.java:2056)

at ponto.DigitalFuncionarioDAO.incluirBiometria(DigitalFuncionarioDAO.java:39)

Troquei para java 5 pois preciso utilizar o SerialBlog.

Aguardo,

30 Respostas

R

manda o código pra darmos uma olhada.

PS: Funcionou o SerialBlob ? :slight_smile:

S
Segue pedaço de código que cria o campo SerialBlob e envia para um metodo que tenta criar o a tabela, onde ocorre o erro, com segue:
try {
			SerialBlob b = new SerialBlob(features);

			digitalFuncionario.setDescricaoDigital(b);
		} catch (NullPointerException e) {
			e.printStackTrace();
Segue pedaço de código que tenta inserir:
public void incluirBiometria(DigitalFuncionario digitalFuncionario) throws SQLException, ClassNotFoundException, ErroPadraoException {
 		try {
 			conexao = CriaConexao.abreConexao();
 			AdicionaSequencia adicionaSequencia = new AdicionaSequencia("AD_FOLHA_DIGITAL_FUNCIONARIOS" );
 			stmt = conexao.prepareStatement(SQL_CREATE_DIGITAL);
 			stmt.setInt(1,digitalFuncionario.getIdentificadorDigital());
 			stmt.setInt(2,digitalFuncionario.getMatriculaFuncionario()); 
 			stmt.setInt(3,digitalFuncionario.getQtByteDigital()); 
 			stmt.setBlob(4,digitalFuncionario.getDescricaoDigital()); 			
 			 			
 			stmt.setString(5,digitalFuncionario.getDataInclusao());
 			stmt.setString(6,digitalFuncionario.getNomeInclusaoRegistro());
 			stmt.setString(7,digitalFuncionario.getDataAlteracao());
 			stmt.setString(8,digitalFuncionario.getNomeAlteracaoRegistro());
 			
 			int i = stmt.executeUpdate();
 			
 		} catch (ClassNotFoundException e) {
 			e.printStackTrace(); 			
 		} catch (SQLException e) {
 			e.printStackTrace(); 			
 		}		
	}

O campo feature é uma byte[] de 10000 posições.
O erro se da quando setBlob.

Aguardo,

S

Oi Rafael, não tenha me atentado que era vc, como estavamos falando eu baixei o java5 para ter acesso aquela class SerialBlob e tentar fazer o insert do blob.

R
SerialBlob b = new SerialBlob((Blob)features);

Tenta isso pq eu acho que SerialBlob implementa Blob, bom to saindo do trabalho, amanhã entro pra ver se funcionou.

Boa Sorte !

:smiley:

S

Infelizmente não funcionou, deu a seguinte msg: Cannot cast from byte[] to Blob.

Amanha estarei aqui também e podemos tentar mais um pouco, se vc puder.

S

Rafael, já no trabalho ?? :?:

R

opa, cheguei da praia agora, ná última resposta que mandei me enganei, era pra mandar outra coisa.
getDescricaoDigital() retorn um SerialBlob ? Se retornar tenta isso, senão me diz o que ela retorna.

stmt.setBlob(4,(Blob)digitalFuncionario.getDescricaoDigital());

:smiley:

R

E ai cara, funcionoiu :?: :?: :?:

S

Praia!!! hummm que beleza, aqui também é Rio…mas Rio Preto, muito sol e nada de praia, infelizmente…bom desculpe-me mas so consegui ver seu retorno agora e fiz as alterações e o teste mas a msg foi a seguinte:Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.sql.rowset.serial.SerialBlob at oracle.jdbc.driver.OraclePreparedStatement.setBlob(OraclePreparedStatement.java:2056) at ponto.DigitalFuncionarioDAO.incluirBiometria(DigitalFuncionarioDAO.java:41) Aguardo, obr.

R

Opa, fala cara.
Estranho, vê pra mim se vc consegue executar essa linha sem erro:

Blob meuBlob = (Blob)digitalFuncionario.getDescricaoDigital();

getDescricaoDigital retorna um SerialBlob ?

S

E ai Rafael, tudo bem, inicialmente aquele comando foi colocado antes dele atualizar o banco e sendo como get ele não deu problema de acesso, mas quando foi atualizar o banco deu “pau” novamente, vou fazer o seguinte, criar uma aplicação teste para fazer esta inclusão e acesso a banco dentro de uma classe e mando para vc dar uma olhada,

Aguarde por favor.

R

Beleza, quando tiver pronta pode mandar pra [email removido]

S
Rafael, tudo bem !! tentei fz uma classe que simulasse a inclusão no blob mas continua dando exception, segue a mesma para vc dar uma olhada.
package VeriFinger;

import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.sql.rowset.serial.SerialBlob;

import padrao.ErroPadraoException;

public class IncluiDigital {
	byte feature[] = new byte[10000];

	SerialBlob digital;

	private static String url = "jdbc:oracle:thin:@192.168.2.101:1521:dsv";

	// driver
	private static String drive = "oracle.jdbc.driver.OracleDriver";

	private static String usuario = "csl";

	// senha do usuário a ser conectado ao banco
	private static String senha = "csl";

	PreparedStatement stmt;

	Connection conn;

	IncluiDigital() {
		try {
			digital = new SerialBlob(feature);
		} catch (Exception e) {
			e.printStackTrace();
		}
		criaConexao();

		try {
			digital = new SerialBlob(feature);
			stmt = conn
					.prepareStatement("insert into ad_folha_digital_funcionarios (ID_DIGITAL_SEQ,CD_MATRICULA,QT_BYTE_DIGITAL,DS_DIGITAL,DT_INC,NM_INC,DT_ALT,NM_ALT) values (1,11854,0,?,null,null,null,null)");
			stmt.setBlob(1, (Blob) digital);
			stmt.executeUpdate();
			System.out.println("Arquivo incluido");
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {

			stmt.close();
			conn.close();
			System.out.println("fechando");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void criaConexao() {
		try {
			Class.forName(drive);
			System.out.println("Driver carregado...");
			conn = DriverManager.getConnection(url, usuario, senha);
			System.out.println("Driver carregado e conexão pega...");
		} catch (ClassNotFoundException e) {
			System.err.println("Classe não carregada " + drive);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new IncluiDigital();
	}

}

java.lang.ClassCastException: javax.sql.rowset.serial.SerialBlob
at oracle.jdbc.driver.OraclePreparedStatement.setBlob(OraclePreparedStatement.java:2056)

R

Cara, tenta o seguinte então:

stmt.setBytes(1,digital.getBytes());

Só que o getBytes tem 2 argumentos que nãosei quais são, tenta dar uma olhada, se vc não conseguir me avisa.

Abraço

ramilani12

Esse campo stmt.setBlob(4,digitalFuncionario.getDescricaoDigital()); o parametro 4 seria o que ?

Prq ao setar um campo blobo o primeiro parametro é um ponteiro lógico , como esta na documentação :

setBlob

void setBlob(int i,
             Blob x)
             throws SQLException

    Sets the designated parameter to the given Blob object. The driver converts this to an SQL BLOB value when it sends it to the database.

    Parameters:
        i - the first parameter is 1, the second is 2, ...
        x - a Blob object that maps an SQL BLOB value 
    Throws:
        SQLException - if a database access error occurs
    Since:
        1.2
S

Rafael eu troquei os campo p/ bytes e aquele erro aparentemente resolveu mas agora ao gravar ele da:

java.sql.SQLException: Tamanho dos dados maior que o tamanho máximo para este tipo: 10000
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

Estou passando mais que o 10000 ou o campo por ser byte não esta suportando e com isto tem que ser blob.

S

Oi Ramilami, bem, este campo I que vc dize não seria a sequencia da coluna na tabela, assim como os outros tipos ?

ramilani12

SINVAL:
Rafael eu troquei os campo p/ bytes e aquele erro aparentemente resolveu mas agora ao gravar ele da:

java.sql.SQLException: Tamanho dos dados maior que o tamanho máximo para este tipo: 10000
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

Estou passando mais que o 10000 ou o campo por ser byte não esta suportando e com isto tem que ser blob.

Pela exception vc está trabalhando com Oracle , nunca trabalhei com Oracle ,e ele não tem um campo longblob igual ao MySql ?

R

Caramba, essa briga tá feia, vou procurar algo agora na hora do almoço.

Abraço,

S

Sim tem, inclusive estou tendo um trabalhão para conseguir gravar no Blob, que é identico ao mssql.
Mas como vc pode ver não estou conseguindo gravar esta coluna como blob, agora (conforme o Rafael esta dando a dica) eu mudei para bytes[] para testar.

ramilani12

Não entendi essa sequência que tu diz ? essa sequencia que vc criou os campos na tabela ?

ramilani12

Prq vc não tenta no lugar de setBlob , setBytes(2, array de bytes) ?

S

Ramilani, respondendo a sua pergunta:
1º - Quando eu digo a sequencia, ela é a sequencia definida dos parametros dentro do stmt , exemplo: insert a (x,digital,z) values (‘1’,?,?); que neste caso a digital seria o 1º parametro , não esta correto?

2º - Não posso colocar bytes, pois o maximo que ele esta deixando gravar é 4000 e como estou trabalhando bom biometria eu preciso de 10000, não sei se ha um outro tipo que poderia comportar 10000 bytes para guardar binario.

ramilani12

SINVAL:
Ramilani, respondendo a sua pergunta:
1º - Quando eu digo a sequencia, ela é a sequencia definida dos parametros dentro do stmt , exemplo: insert a (x,digital,z) values (‘1’,?,?); que neste caso a digital seria o 1º parametro , não esta correto?

2º - Não posso colocar bytes, pois o maximo que ele esta deixando gravar é 4000 e como estou trabalhando bom biometria eu preciso de 10000, não sei se ha um outro tipo que poderia comportar 10000 bytes para guardar binario.

Ah tá entendi , mas prq não tenta setBytes(2,arrayBytes) no lugar do setBlob() ?

para recuperar Blob blob = rs.getBlob(“campo”);

S

Eu já tentei mas ele da aquela msg assim:

java.sql.SQLException: Tamanho dos dados maior que o tamanho máximo para este tipo: 10000
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

ramilani12

SINVAL:
Eu já tentei mas ele da aquela msg assim:

java.sql.SQLException: Tamanho dos dados maior que o tamanho máximo para este tipo: 10000
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

Ah tá , pelo que entendi o campo não suporta 10000 bytes , é imagem que vc ta querendo armazenar ? acho que só comprimindo esse seu array …

L

Por acaso o erro não está nesta linha:

stmt = conn.prepareStatement(“insert into ad_folha_digital_funcionarios (ID_DIGITAL_SEQ,CD_MATRICULA,QT_BYTE_DIGITAL,DS_DIGITAL,DT_INC,NM_INC,DT_ALT,NM_ALT) values (1,11854,0,?,null,null,null,null)”);

não é stmt= conn.preparedStatement

:slight_smile: falow

S

Desculpe-me, mas acho que não entendi bem, meu comando esta como vc informou não esta ?

S

Tudo bem Luiz, bem não sei se vc esta falando do “d” do prepareStament, mas acho que esta correto.

S

PESSOAL, quero deixar postado aqui que abri um chamado na Oracle e a mesma até o momento disse que estão avaliando o problema, mas inicialmente eles disseram que o driver que suporta o SerialBlob é após a versao 10.2.0.1.0, mas ainda não confirmaram com certeza, mesmo assim, irei fazer um teste.

Criado 29 de julho de 2005
Ultima resposta 3 de ago. de 2005
Respostas 30
Participantes 4