Pegar tipo de dados de uma campo do banco?

4 respostas
T

Ola galera!!

Depois de ler muitos posts daqui do GUJ consegui fazer metade do que eu queria!!!

Estou precisando descobrir qual o TIPO do dado de um campos de uma tabela do banco de dados.

Abaixo segue o que consegui fazer por enquanto, dado uma certa tabela retornar TODOS os campos da mesma, porem gostaria de descobrir tambem seus respectivos TIPOS de dados.

public  static String[] getCamposTabela (String nomeTabela) {
        String retorno[] = null;
        Conexao conexao = new Conexao();
        try {
             DatabaseMetaData  dmd = conexao.con.getMetaData();  

             //Busca os Schemas do banco...  
             ResultSet rsSchemas = dmd.getSchemas();  
             ResultSet rsTables;
             ResultSet rsColumns;
             rsSchemas.next(); rsSchemas.next();
             
             //while(rsSchemas.next()) {  

               //Traz todas as tabelas referente ao Schema corrente.  
               //rsTables = dmd.getTables(null,rsSchemas.getString(1),"%",null);  
               rsTables = dmd.getTables(null,null,null,new String[] {"TABLE"});  
               
               while(rsTables.next()) {  
                     //Lista as tabelas...  
                     //System.out.println("Tables " + rsTables.getString(3));  
                    if (rsTables.getString(3).equals(nomeTabela.toUpperCase())) {               
                       //Busca as colunas das tabelas...  
                         rsColumns = dmd.getColumns(null,rsSchemas.getString(1),rsTables.getString(3), null);  
                         int i=0;
                         rsColumns.afterLast();
                         retorno = new String[rsColumns.getRow()-1];
                         rsColumns.beforeFirst();
                         
                         while(rsColumns.next()){  
                           //Lista as colunas...  
                           retorno[i] = rsColumns.getString(4);
                           i++;                       
                         }  
                   }
               //}  
             }            
       } catch (Exception erro) { System.out.println(erro); }               
       conexao.finalizar();
        return retorno;
    }

Sera que eh possivel??

Vlw pela ajuda

4 Respostas

thiago.correa

Acredito que não brother, pelo menos eu não vi nenhum método na API do ResultSet que o fizesse.

Y

É que esse tipo de informação é obtido apenas nos metadados de um ResultSet.

Basta você usar o getColumnType() e o getColumnTypeName() para conseguir o que quer.

Exemplo:

ResultSetMetaData rsmd = statement.executeQuery("SELECT * FROM table").getResultSetMetaData();

for(int column = 1; column <= rsmd.getColumnCount(); column++)
  {
   System.out.println("Tipo: " + rsmd.getColumnType(column));
   System.out.println("Nome do tipo: " + rsmd.getColumnTypeName(column));
   System.out.println();
  }

Dica: ao invés de usar estes comandos para pular duas linhas…

rsSchemas.next(); rsSchemas.next();

Tu podes (melhor dizendo, deve) usar o método ResultSet relative(), que move o ponteiro do ResultSet N linhas relativas à posição atual, podendo ter valores negativos ou positivos. Use isso no seu caso:

rsSchemas.relative(2);

Exemplo: se tu queres mover 5 linhas a frente

rsSchemas.relative(5);

Quer voltar 10 linhas:

rsSchemas.relative(-10);
T

VLW Yky Mattshawn!!!

Era exatamente o que eu precisava!!
Agora consegui!!!

VLW MESMO!!!

Tacio_Dias_Palhao_Me

Olá, estou tentando fazer esse lance de ler do banco quais os tipos de dados do banco, gostaria que vocês me ajudassem a ver o que há de errado nesse código pq eu não to conseguindo entender porque essa excessão tá acontecendo.

e mais uma pergunta, Tem como fazer isso usando hibernate?

eis a exception : ERROR: syntax error at or near "$1"

Desde já obrigado.

String url = "jdbc:postgresql://localhost:5432/teste";
		
		Class.forName("org.postgresql.Driver");
		Connection connection = 
			DriverManager.getConnection(url, "x","y"); // nome e password foram censurados.

		connection.setAutoCommit(false);
		
		PreparedStatement statement = connection.prepareStatement("SELECT * FROM ?" );
		
		Scanner sc = new Scanner(System.in);
		String nomeTabela = sc.next();
		
		statement.setString(1, nomeTabela);
		
		ResultSetMetaData rsmd = statement.executeQuery().getMetaData(); //Aqui da pau!
		
		
		    for(int column = 1; column <= rsmd.getColumnCount(); column++)  
		      {  
		       System.out.println("Tipo: " + rsmd.getColumnType(column));  
		       System.out.println("Nome do tipo: " + rsmd.getColumnTypeName(column));  
		       System.out.println();  
		      }  
		
		    connection.rollback();
Criado 30 de dezembro de 2006
Ultima resposta 31 de mar. de 2008
Respostas 4
Participantes 4