Select no BD Firebird retorna '?' no lugar de letras acentuadas

Olá, tenho um banco firebird e no banco tenho cadastrados itens com acento, por ex. tenho cadastrado um item “HONORÁRIOS” e pelo ibexpert eu consigo ver com acento la no banco, porem ao fazer o select no java ele aparece no sistema como um quadradinho no lugar do ‘Á’.
O que devo fazer?

[quote=mateusviccari]Olá, tenho um banco firebird e no banco tenho cadastrados itens com acento, por ex. tenho cadastrado um item “HONORÁRIOS” e pelo ibexpert eu consigo ver com acento la no banco, porem ao fazer o select no java ele aparece no sistema como um quadradinho no lugar do ‘Á’.
O que devo fazer?[/quote]

Se em outro banco de dados a persistência e a consulta ocorrem normalmente, ou seja, gravam e retorna a acentuação de forma correta, possivelmente tu deve fazer alguma configuração no Firebird para que o mesmo aceite caracteres especiais. Faça um teste.

Poste o código que você tá usando pra conectar com o banco.

Segue o codigo de conexao

[code]/*

  • To change this template, choose Tools | Templates

  • and open the template in the editor.
    /
    package importacaoNotaCompra;
    import java.sql.
    ;
    import java.util.ArrayList;
    import javax.swing.JOptionPane;
    /**

  • @author adm

  • A diferença entre essaa classe e o select normal é que essa aqui retorna o o arraylist com

  • outro arraylist dentro com todos os resultados e não só 1.
    */
    public class SelectArray {
    //os parametros devem ser tipo assim: select(“select * from produto”,{“nomeProduto”,“precoProduto”})
    //e ele retorna um arrayList com outro ArrayList em cada item, que seriam os campos q eu informei
    public ArrayList select(String sql,String[] dado){
    ArrayList registros=new ArrayList();
    String caminhoDoBanco=Configs_Etc.CarregarConfiguracoesXML.caminhoDoBanco;

    String database = caminhoDoBanco; // jdbc:postgresql://localhost/locadoras eh o q deve ta dentro do arquivo
    String usuario = "SYSDBA";
    String senha = "masterkey";
    String driverName="org.firebirdsql.jdbc.FBDriver";
    Connection conexao;
    Statement consulta;
    ResultSet resultado;
    try{
        Class.forName(driverName);
        conexao = DriverManager.getConnection(database,usuario,senha);
        consulta = conexao.createStatement();
        resultado = consulta.executeQuery(sql);
        while(resultado.next()){
            ArrayList dados=new ArrayList();
            for(int l=0;l<dado.length;l++){
                String valorPesquisado=resultado.getString(dado[l]);
                System.out.println(valorPesquisado);
                if(valorPesquisado==null){valorPesquisado="";}else{valorPesquisado=valorPesquisado.trim();}
                dados.add(valorPesquisado);
            }
            registros.add(dados);
        }
        consulta.close();
        conexao.close();
        resultado.close();
    }catch(Exception e){
        JOptionPane.showMessageDialog(null,e.getLocalizedMessage());
        ImportarNotaCompra.possoDarCommit=false;
    }
    return registros;
    

    }
    }
    [/code]

É problema de configuração de caracteres, já passei por isso, dei uma mexida na sua classe, veja se funciona!

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package importacaoNotaCompra;
import java.sql.*;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import java.util.Properties;
/**
 *
 * @author adm
 * A diferença entre essaa classe e o select normal é que essa aqui retorna o o arraylist com
 * outro arraylist dentro com todos os resultados e não só 1.
 */
public class SelectArray {
    //os parametros devem ser tipo assim: select("select * from produto",{"nomeProduto","precoProduto"})
    //e ele retorna um arrayList com outro ArrayList em cada item, que seriam os campos q eu informei
    public ArrayList select(String sql,String[] dado){
       ArrayList registros=new ArrayList();
       String caminhoDoBanco=Configs_Etc.CarregarConfiguracoesXML.caminhoDoBanco;
        
       String database = caminhoDoBanco; // jdbc:postgresql://localhost/locadoras eh o q deve ta dentro do arquivo          	   
       String driverName="org.firebirdsql.jdbc.FBDriver";
       Connection conexao;
       Statement consulta;
       ResultSet resultado;	   
	   
       try{
	   
           Class.forName(driverName);
		   
	   Properties props = new Properties();
           props.put("user", "SYSDBA");
           props.put("password", "masterkey");
           props.put("charset", "UTF8");
           props.put("lc_ctype", "ISO8859_1");        		   
           
	   conexao = DriverManager.getConnection(database,props);
		   
           consulta = conexao.createStatement();
           resultado = consulta.executeQuery(sql);
           while(resultado.next()){
               ArrayList dados=new ArrayList();
               for(int l=0;l<dado.length;l++){
                   String valorPesquisado=resultado.getString(dado[l]);
                   System.out.println(valorPesquisado);
                   if(valorPesquisado==null){valorPesquisado="";}else{valorPesquisado=valorPesquisado.trim();}
                   dados.add(valorPesquisado);
               }
               registros.add(dados);
           }
           consulta.close();
           conexao.close();
           resultado.close();
       }catch(Exception e){
           JOptionPane.showMessageDialog(null,e.getLocalizedMessage());
           ImportarNotaCompra.possoDarCommit=false;
       }
       return registros;
    }
}

Obrigado SalomaoNeto, funcionou certinho…

Cara, seria bem melhor você fazer apenas o arquivo de conexão em uma classe e os métodos para pegar valores e exibir em outras…

Acontece que eu uso 2 tipos de conexão, uma eu deixo com auto-commit e outra eu deixo commit manual pra caso der um erro eu der um rollback naquela que usa o commit manual…

E tem outro problema, como eu vou fazer pra fechar a conexão?
Pois (que eu saiba) os resultset,conection e statement nao sao fechados quando o programa é fechado.

Ai você fecha com o comando .close();:smiley:

sim mas eu digo, por ex. quando o cara fecha o programa, as conexões não sao fechadas…
Ou tem algum jeito de mandar algo como closeOnExit(), que ele feche automaticamente quando o programa é fechado?

Você poderia colocar no final do método para fechar a conexão, exemplo.

Você apertou no botão pra exibir todos os registros, ai ele executa o método lá

classe.ExibirRegistros();

Dentro do método , no final dele mesmo você põe pra fechar lá a conexão, resultsets, statements etc.

Mas é que o meu programa não é sequencial fixo, ele é uma janela normal aonde o usuario pode fazer varias coisas e fechar o programa clicando no X quando ele quiser…
E outra, ele pode simplesmente dar um ctrl-alt-del e finalizar o processo javaw.exe, aí cai no mesmo problema…

Se for um jframe você pode usar esse comando

[code]
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{

con.close();
System.exit(0);
}
}); [/code]

hmm interessante nao sabia que dava pra fazer isso…
Mas e no caso de o cara encerrar o processo na mão tem algum jeito de contornar a situação?

Pois é, essa ai eu não sei … mas talvez haja um modo, não sou muito chegado a app desktop.

Talvez uma excessão ^^

Mas se tá mais facil pra vc em uma classe então de boa.

OK vou fazer como vc sugeriu, vou por tudo em uma classe só, e vou fazer uma opcional que eu deixo com o commit manual.

galera estou com o mesmo problema de acentuação mas não consigui resolver!!!