JDBC e SQL

Java

07/08/2005

Saudações a todos os colegas do mundo Java. Estou procurando ajuda sobre a utilização dessa API. Mais precisamente, consegui fazer a conexão com uma base de dados através dessa API, e agora gostaria de saber como proceder a visualização das Tabelas existentes na fonte de dados a qual me conectei. Gostaria de, por exemplo, listar as tabelas existentes, após isso, listar os atributos da tabela selecionada e os registros da tabela.

Alguém pode me ajudar?

Grato


Isandro Azedo

Isandro Azedo

Curtidas 0

Respostas

Mauricio.linhares

Mauricio.linhares

07/08/2005

[quote:aa36b7333c=´isandro azedo´]Saudações a todos os colegas do mundo Java. Estou procurando ajuda sobre a utilização dessa API. Mais precisamente, consegui fazer a conexão com uma base de dados através dessa API, e agora gostaria de saber como proceder a visualização das Tabelas existentes na fonte de dados a qual me conectei. Gostaria de, por exemplo, listar as tabelas existentes, após isso, listar os atributos da tabela selecionada e os registros da tabela.

Alguém pode me ajudar?

Grato[/quote:aa36b7333c]
Pra pegar informações do banco você vai precisar de um objeto DatabaseMetadata:

[url]http://java.sun.com/j2se/1.5.0/docs/api/java/sql/DatabaseMetaData.html[/url]

Ele pode ser conseguido a partir de qualquer objeto ResultSet que você tenha conectado ao banco.


GOSTEI 0
Isandro Azedo

Isandro Azedo

07/08/2005

[quote:790c455d72=´isandro azedo´]Saudações a todos os colegas do mundo Java. Estou procurando ajuda sobre a utilização dessa API. Mais precisamente, consegui fazer a conexão com uma base de dados através dessa API, e agora gostaria de saber como proceder a visualização das Tabelas existentes na fonte de dados a qual me conectei. Gostaria de, por exemplo, listar as tabelas existentes, após isso, listar os atributos da tabela selecionada e os registros da tabela. Alguém pode me ajudar? Grato

Pra pegar informações do banco você vai precisar de um objeto DatabaseMetadata:

[url]http://java.sun.com/j2se/1.5.0/docs/api/java/sql/DatabaseMetaData.html[/url]

Ele pode ser conseguido a partir de qualquer objeto ResultSet que você tenha conectado ao banco.[/quote:790c455d72]

Obrigado pela ajuda, já estou iniciando os testes. Gostaria de saber, no entanto, se eu posso implementar isso de uma maneira mais fácil, visualmente, como no delphi. Atualmente eu estou utilizando o NetBeans, ou seja, programando tudo.


GOSTEI 0
Mauricio.linhares

Mauricio.linhares

07/08/2005

Rapaz, se você tá procurando por desenvolvimento RAD, é melhor continuar com o Delphi. Em Java nós não costumamos trabalhar com isso.


GOSTEI 0
Isandro Azedo

Isandro Azedo

07/08/2005

Rapaz, se você tá procurando por desenvolvimento RAD, é melhor continuar com o Delphi. Em Java nós não costumamos trabalhar com isso.


Ok, mas por exemplo.

Criei um DatabaseMetaData para recuperar o metadado

DatabaseMetaData metaData = conexao.getMetaData();

Eu só gostaria de saber como eu faço pra imprimir, por exemplo, os nomes das tabelas existentes no catálogo, ou seja, na base.

O nome do catalogo eu peguei assim:

String catalogo = conexao.getCatalog();

grato pela ajuda


GOSTEI 0
Mauricio.linhares

Mauricio.linhares

07/08/2005

Assim você pega todas:


DatabaseMetaData metaData = conexao.getMetaData(); 
ResultSet resultSet = metaData.getTables(null, null, "¬", null);



Veja os outros métodos da interface DatabaseMetaData que eles oferecem praticamente todas as informações sobre o banco.


GOSTEI 0
Isandro Azedo

Isandro Azedo

07/08/2005

Assim você pega todas:

DatabaseMetaData metaData = conexao.getMetaData(); 
ResultSet resultSet = metaData.getTables(null, null, "¬", null);

Veja os outros métodos da interface DatabaseMetaData que eles oferecem praticamente todas as informações sobre o banco.


Muito obrigado pela ajuda, você realmente está me ajudando muito. Mas se não for pedir muito, você pode me dizer como que eu imprimo os nomes das tabelas a partir disso? Eu dei uma olhada nos outros métodos da interface, mas não encontrei algo.


GOSTEI 0
Mauricio.linhares

Mauricio.linhares

07/08/2005

Pra imprimir os nomes das tabelas você vai ter que pegar os campos do ResultSet, do mesmo jeito que você faria se isso fosse um select normal.

Tem um ótimo material de JDBC aqui:[url]http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/index.html[/url]


GOSTEI 0
Isandro Azedo

Isandro Azedo

07/08/2005

Pra imprimir os nomes das tabelas você vai ter que pegar os campos do ResultSet, do mesmo jeito que você faria se isso fosse um select normal. Tem um ótimo material de JDBC aqui:[url]http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/index.html[/url]


Ok, tentei, mas não consegui. O seguinte trecho de código mostra o que eu tentei fazer para imprimir as tabelas:

DatabaseMetaData metaData = conexao.getMetaData(); (peguei MetaData da conexao)

ResultSet tabelas = metaData.getTables(null, null, ´¬´, null); (peguei as tabelas e atribui seu valor ao resultset tabelas)

ResultSetMetaData resultMetaData = tabelas.getMetaData(); (peguei MetaData do resultset tabelas)

int count = resultMetaData.getColumnCount(); (peguei o número de resultados e atribuí à varável count para ser utilizada pra percorrer o resultado)

for(int i=1;i<=count;i++){
nomeTabela = tabelas.getString(i);
}

Mensagem de erro:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Estado de cursor inválido
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3908)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5699)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:353)
at classes.database.Source.obterTabelas(Source.java:55)
at classes.database.SourceTest.main(SourceTest.java:28)


GOSTEI 0
Isandro Azedo

Isandro Azedo

07/08/2005

[quote:d8768d3f8a=´isandro azedo´]
Pra imprimir os nomes das tabelas você vai ter que pegar os campos do ResultSet, do mesmo jeito que você faria se isso fosse um select normal. Tem um ótimo material de JDBC aqui:[url]http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/index.html[/url]


Ok, tentei, mas não consegui. O seguinte trecho de código mostra o que eu tentei fazer para imprimir as tabelas:

DatabaseMetaData metaData = conexao.getMetaData(); (peguei MetaData da conexao)

ResultSet tabelas = metaData.getTables(null, null, ´¬´, null); (peguei as tabelas e atribui seu valor ao resultset tabelas)

ResultSetMetaData resultMetaData = tabelas.getMetaData(); (peguei MetaData do resultset tabelas)

int count = resultMetaData.getColumnCount(); (peguei o número de resultados e atribuí à varável count para ser utilizada pra percorrer o resultado)

for(int i=1;i<=count;i++){
nomeTabela = tabelas.getString(i);
}

Mensagem de erro:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Estado de cursor inválido
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3908)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5699)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:353)
at classes.database.Source.obterTabelas(Source.java:55)
at classes.database.SourceTest.main(SourceTest.java:28)[/quote:d8768d3f8a]

Depois eu modifiquei o for, mudando o conteúdo para:

nomeTabela = resultMetaData.getTableName(i);

Mesmo assim deu o mesmo erro.

O que acontece?


GOSTEI 0
Isandro Azedo

Isandro Azedo

07/08/2005

[quote:77bfcae9d4=´isandro azedo´][quote:77bfcae9d4=´isandro azedo´]
Pra imprimir os nomes das tabelas você vai ter que pegar os campos do ResultSet, do mesmo jeito que você faria se isso fosse um select normal. Tem um ótimo material de JDBC aqui:[url]http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/index.html[/url]


Ok, tentei, mas não consegui. O seguinte trecho de código mostra o que eu tentei fazer para imprimir as tabelas:

DatabaseMetaData metaData = conexao.getMetaData(); (peguei MetaData da conexao)

ResultSet tabelas = metaData.getTables(null, null, ´¬´, null); (peguei as tabelas e atribui seu valor ao resultset tabelas)

ResultSetMetaData resultMetaData = tabelas.getMetaData(); (peguei MetaData do resultset tabelas)

int count = resultMetaData.getColumnCount(); (peguei o número de resultados e atribuí à varável count para ser utilizada pra percorrer o resultado)

for(int i=1;i<=count;i++){
nomeTabela = tabelas.getString(i);
}

Mensagem de erro:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Estado de cursor inválido
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3908)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5699)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:353)
at classes.database.Source.obterTabelas(Source.java:55)
at classes.database.SourceTest.main(SourceTest.java:28)[/quote:77bfcae9d4]

Depois eu modifiquei o for, mudando o conteúdo para:

nomeTabela = resultMetaData.getTableName(i);

Mesmo assim deu o mesmo erro.

O que acontece?[/quote:77bfcae9d4]

Novamente aqui estou, pra descrever a última tentativa:

DatabaseMetaData bd_MetaData = conexao.getMetaData;
ResultSet tabelas = bd_MetaData.getTables(null, null, ´¬´, null);
ResultSetMetaData resultMetaData = tabelas.getMetaData();
int count=resultMetaData.getColumnCount();

for(int i=1;i<=count;i++){
nomeTabela = resultMetaData.getTableName(i);
areaTabelas.append(nomeTabela+´\n´);
}

Nesse trecho não houve erro, entretanto a impressão saiu em branco, ou seja, nenhum resultado. Até parece que não existem tabelas, mas a base de dados referida é a base exemplo Pubs do SQL Server.


GOSTEI 0
Mauricio.linhares

Mauricio.linhares

07/08/2005

[quote:0edd7c78a7=´isandro azedo´]
int count = resultMetaData.getColumnCount(); (peguei o número de resultados e atribuí à varável count para ser utilizada pra percorrer o resultado)[/quote:0edd7c78a7]

Veja o nome do método, você está pegando a quantidade de colunas, não a quantidade de linhas do result set. Dê uma lidinha no tutorial, vai ajudar muito mais.


GOSTEI 0
Goncaze

Goncaze

07/08/2005

[b:7db7fb861f]Olha, deixa ver se eu posso ajudar. [/b:7db7fb861f]

// pega as tabelas do banco
ResultSet rsTabela = dbmd.getTables(null, null, ´¬´, null);

// out tabelas
while( rsTabela.next() ){
System.out.println(´\n Tabelas = ´ + rsTabela.getString(3));
}

[b:7db7fb861f]repare aquele nº 3, é ele o índice que imprimiu minhas tabelas no mysql, talvez vc também consiga assim. Pra acabar c/ qualquer dúvida vou mandar meu código por inteiro tá bom.[/b:7db7fb861f]

import java.sql.*;

public class Exemplo1 {
public static void main(String[] args) throws SQLException {

// registrar o Driver JDBC do banco de dados, neste caso estou usando o da Oracle
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

// String de conexao para uma base Oracle
Connection conn = DriverManager.getConnection(´jdbc:mysql://localhost:3306/bdteste´);

// recuperar a classe DatabaseMetadaData a partir da conexao criada
DatabaseMetaData dbmd = conn.getMetaData();

System.out.println ( ´Versao do Driver JDBC = ´+ dbmd.getDriverVersion());
System.out.println ( ´Versao do Banco de Dados = ´+ dbmd.getDatabaseProductVersion());
System.out.println ( ´Suporta Select for Update? = ´+ dbmd.supportsSelectForUpdate());
System.out.println ( ´Suporta Transacoes? = ´+ dbmd.supportsTransactions());
System.out.println ( ´\n\n Catalogo? = ´+ conn.getCatalog() + ´\n´);

// pega as tabelas do banco
ResultSet rsTabela = dbmd.getTables(null, null, ´¬´, null);

// out tabelas
while( rsTabela.next() ){
System.out.println(´\n Tabelas = ´ + rsTabela.getString(3));
}


// retornar todos os schemas(usuarios) do Banco de Dados
ResultSet r2 = dbmd.getSchemas();
while (r2.next()) {
System.out.println(´saco SCHEMA DO BD = ´ + r2.getString(1));
}
}
}


GOSTEI 0
POSTAR