Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

paulojuchem

Java + Firebird

Recommended Posts

opa, estou com alguns problemas para pegar dados do firebird no java, vejam o codigo como esta:

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;
import java.sql.Statement;  

public class FirebirdAccess {  

  public Connection con = null;  
  public Statement stm = null;
  public ResultSet resultSet = null;

  public void Conexao() {  

     try {  

        Class.forName("org.firebirdsql.jdbc.FBDriver");  
        con = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:/Users/paulo/teste.fdb","SYSDBA","123456");  
        stm = con.createStatement();  

     } catch (Exception e) {  
   	 System.out.println(e);
   	 System.out.println("");
        System.out.println("Não foi possível conectar ao banco: " + e.getMessage());  
     }  

  }  
  public void fetchAll(String query) {
	try{
		System.out.println("Exibindo resultados para a query: "+query);
		Conexao();
		resultSet = stm.executeQuery(query);
		int j = 0;
		while (resultSet.next()) {

			System.out.println("entrei no while "+j+'x');

			String label = "["+j+"]=>[";
			for  (int i = 1; i<= resultSet.getMetaData().getColumnCount(); i++){
				label+=("["+resultSet.getMetaData().getColumnName(i)+"] => "+ resultSet.getString(resultSet.getMetaData().getColumnName(i))+" ");
			}
			label+= "]";
			System.out.println(label);
			j++;
		}
	}catch(Exception e){
		System.out.println(e.getMessage());
	}
}

}  

essa eh minha classe, eu dou um new nela na no main e passo para o metodo fetchAll a query.

Tenho duas tabelas, t1 e t2; Se eu der um fetchAll em t3, recebo uma exception falando que tal tabela nao existe, e ela nao existe mesmo. Mas se eu der um fetchAll(Select * FROM t1) o resultSet.next() retorna false logo de cara, mas tem dados la, nao faz sentido, eu uso exatamente o mesmo codigo com o mysql, so muda a o driver, nao sei o que esta errado.. nao entra no while nunca no firebird...

pelo que eu vi esta conectando na base, ele da o erro se eu der select na t3 mas nao da erro se eu der select na t1, porem nao recebo nada de volta...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulo,

 

Toda vez que você faz uma consulta ao banco, você carrega o drive e estabelece uma conexão.

Neste caso, acredito que seja necessário fazer isto apenas uma vez quando executa a classe.

 

Isto parece ser problema relacionado à instância do objeto resultSet.

Sugiro você fazer o método fechAll retornar um ResultSet, ao invés de alterar diretamente a variável global 'resultSet'.

 

E criar um método para impressão do resultSet. #Separar as coisas

 

Método de consulta:

public ResultSet fetchAll(String query) {
   ResultSet rs = new ResultSet();
   try{
       rs = stm.executeQuery(query);
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
   return rs;
}

 

Método para impressão:

public void viewResultSet(ResultSet rs){
   int j = 0;
   while (rs.next()) {
       String label = "["+j+"]=>[";
       for  (int i = 1; i<= resultSet.getMetaData().getColumnCount(); i++){
           label+=("["+rs.getMetaData().getColumnName(i)+"] => "+  rs.getString(rs.getMetaData().getColumnName(i))+" ");
       }
       label+= "]";
       System.out.println(label);
       j++;
   }
}

 

Quando você for executar a classe, pode fazer assim:

public FirebirdAccessTest{
   public static void main(String args[]){
       FirebirdAccess fa = new FirebirdAccess();
       fa.Conexao();

       String query1 = "SELECT * FROM tb1";
       ResultSet rs = fa.fetchAll(query1);
       fa.viewResultSet(rs);
   }
}

 

Não pude testar, mas é uma sugestão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, obrigado ricci , entendi o que voce quis dizer, este era apenas um teste para ver como estavam as coisas, mas enfim, peguei uma versao anterior do jaybird e rodou, o mesmo codigo, agora vou arrumar as coisas e ainda tem um tal de hibernate que falam muito bem, mas vou por etapas :D

Ainda estou comecando no java, tenho uma certa dificuldade em declarar objetos no lugar certo, como voce mesmo citou, nao ha necessidade do resultset ser global...

abracos

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.