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(); ué
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!!!