Listar as tabelas de uma base de dados no Delphi

19/07/2008

18

Boa noite pessoal, gostaria de listar as tabelas de uma base de dados no delphi, não sei, e nem tenho ideia de como fazer, eu utilizo o firebird, obrigado a todos, abraços.


Responder

Posts

19/07/2008

Marco Salles

depende do seu componetes de acesso ... Da tecnologia empregada

Voce esta acessando este Banco com que ????


Responder

19/07/2008

Onhide86

pois é, eu quero listar mas não sei como, tem alguma dica? abraço.


Responder

19/07/2008

Marco Salles

edinho_[b:78aca241b9]faccin[/b:78aca241b9] isto com o DbExpress é facim [b:78aca241b9]facim[/b:78aca241b9]

em um formulário coloque os seguintes componentes

  SQLConnection1: TSQLConnection;
    SQLQuery1: TSQLQuery;
    SQLQuery2: TSQLQuery;
    DataSource1: TDataSource;
    ClientDataSet1: TClientDataSet;
    DataSource2: TDataSource;
    ClientDataSet2: TClientDataSet;
    DataSetProvider1: TDataSetProvider;
    DataSetProvider2: TDataSetProvider;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;


os configure Corretamente .. Depois no Objecto Inspector do form

procedure TForm1.FormCreate(Sender: TObject);
begin
sqlquery1.setschemainfo(sttables,´´,´´);
clientdataset1.open;
end;


e no evento OnDataChange do DataSource1 Escreva :

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
  tb: string;
begin
  clientdataset2.close;
  tb := clientdataset1.fieldbyname(´table_name´).asstring;
  sqlquery2.setschemainfo(stcolumns,tb,´´);
  clientdataset2.open;
end;


Isto ai vai de dar muito mais informação do que voce necessita
[b:78aca241b9]Se quiser Mesmo so as Tabelas , voce pode configurar o DbGrid para
Mostar so o Campo TABLE_NAME [/b:78aca241b9]e esquecer os Outros componentes
(DataSource2,SqlQuer2,DataSetProvider2,ClientDataSet2 DbGrid2 etc..)

Click No DbGrid em Colums Opcões Adicione Uma so Coluna

e No Evento OnCreate escreva o Codigo :

procedure TForm1.FormCreate(Sender: TObject);
begin
sqlquery1.setschemainfo(sttables,´´,´´);
clientdataset1.open;
DbGrid1.Columns.Add.Field:=clientdataset1.FieldByName(´TABLE_NAME´);
end;


espero ter sido util depois deste Livro...


Responder

19/07/2008

Onhide86

Valeu marco, funcionou legal, abraço.


Responder

16/08/2008

Onhide86

Marco Sales, tentei fazer novamente com o Delphi 2006 mas esta dando um erro na seguinte linha:

sqlquery1.setschemainfo(sttables,´´,´´);

e esta apontando para o ´sttables´, mas no delphi 7 não me lembro de ter declarado alguma coisa a mais, sab me dizer o que eu fiz de errado, abraço.


Responder

16/08/2008

Marco Salles

Voce esta Usando VCL Forms application ???

se for veja que a Unit [u:5d3dba672c]Vcl.SqlExpr[/u:5d3dba672c]
define o Tipo

TSchemaType = (stNoSchema, stTables, stSysTables, stProcedures, stColumns,
stProcedureParams, stIndexes, stPackages, stUserNames);

que é parãmetro da procedure setschemainfo tb definida na mesma Unit

De qualquer forma tente acrescentando mais um párametro..

sqlquery1.setschemainfo(sttables,´´,´´); assim:
sqlquery1.setschemainfo(sttables,´´,´´,´´);



Responder

16/08/2008

Onhide86

Agora sim, estava fantando essa parte:
Unit Vcl.SqlExpr

valeu ai, abraço.


Responder

16/08/2008

Onhide86

Outra coisa Marco, tem como eu listar os indices, chaves primarias, chaves estrangeiras, dominios, etc, com este recurso no dsbexpress.

Obrigado.


Responder

16/08/2008

Marco Salles

Outra coisa Marco, tem como eu listar os indices, chaves primarias, chaves estrangeiras, dominios, etc, com este recurso no dsbexpress. Obrigado.


Tem sim .. De maneira muito fácil...
Depois te respondo pq Hoje sábado vou comer uma peixada...


Responder

16/08/2008

Onhide86

ok, muito obrigado, e boa peixada ai, hehe


Responder

19/08/2008

Marco Salles

cada banco de dados possui um catálogo, um conjunto de tabelas que armazenam informações sobre o próprio banco de dados..Estas tabelas guardam informações sobre nome de tabelas, colunas, tipos, tamanhos, índices, views, triggers, procedures etc.
para se obter informações sobre metadados, basta que você de um select na respectiva tabela de acordo com o banco usado.
o problema é que a mesma instrução não se aplica a outro bd pq cada bd possuem [b:828606afd1]tabelas internas com nomes e estruturas diferentes[/b:828606afd1]
O DbExpress definiu uma interface para padronizar a obtenção dessas informações, não importa o banco de dados que esteja utilizando.
essa interface se chama [b:828606afd1]isqlmetadata[/b:828606afd1] e está declarada na unit dbxpress.pas < estou
falando do Delphi 7 > ..A idéia é que cada Diver (db2, oracle, ib / fb etc..) implemente esta Interface

Olhe então a definição do método [b:828606afd1]setschemainfo .[/b:828606afd1]

SetSchemaInfo(SchemaType: TSchemaType; SchemaObjectName, 
SchemaPattern: string; PackageName: string = ´´ );


//definição do Tipo TSchemaType
stNoSchema // eo mesmo que dar um SELECT * FROM <Nome Da Tabela> stTables // Tabelas do BD stSysTables // Tabelas INTERNAS do BD stProcedures // Procedures stColumns // Nome bem Sugestivo stProcedureParams //para saber os parametros vc precisa saber qual a Procedure stIndexes // Nome bem Sugestivo stPackages **** Procurei ha tempos atras sobre isto e nãao consegui


A outra informação que voce deve ter é sobre o parametro [u:828606afd1]SchemaObjectName[/u:828606afd1] do método

{quando SchemaType é stColumns ou stIndexes, ---->>>>>> SchemaObjectName é o nome de uma tabela. Quando SchemaType é stProcedureParams, ---->>>>>SchemaObjectName é o nome de um procedimento armazenado. Quando SchemaType é stNoSchema, stTables, stSysTables, ou stProcedures, ---->>>>>SchemaObjectName é ignorado.


por fim o parametro [b:828606afd1]SchemaPattern[/b:828606afd1]

SchemaPattern padrão SQL é uma máscara que filtra os dados resultantes.
Assim se o Parametro [b:828606afd1]stTables[/b:828606afd1] for passado ele filtara o Campo [b:828606afd1]Tabble_Name[/b:828606afd1]
Assim se o Parametro[b:828606afd1] stColumns [/b:828606afd1]for passado ele filtara o Campo [b:828606afd1]COLUMN_Name[/b:828606afd1]
Assim se o Parametro [b:828606afd1]stProcedures[/b:828606afd1] for passado ele filtara o Campo [b:828606afd1]Proc_Name[/b:828606afd1] etc...

Como Funciona esta Máscara>>>Esta Mascara tem dois Curingas o ¬ e o _

Exemplo

¬E pesquisa na Coluna do Parametro TSchemaType passado Tudo que TERMINA com E E¬ pesquisa na Coluna do Parametro TSchemaType passado Tudo que COMEÇA com E ¬E¬ pesquisa na Coluna do Parametro TSchemaType passado Tudo que TEM E


_E¬ pesquisa na Coluna do Parametro TSchemaType passado Tudo que
COMEÇA com E A PARTIR DA SEGUNDA letra posição
__E¬ pesquisa na Coluna do Parametro TSchemaType passado Tudo que
COMEÇA com E A PARTIR DA terceira posição
__¬E¬ pesquisa na Coluna do Parametro TSchemaType passado Tudo que
COMEÇA TEM E A PARTIR DA terceira posição


Sabendo disso voce esta apto a buscar todas as informaçoes que são retornadas pelo método SetSchemaInfo

Por exemplo :
[b:828606afd1]Retorna todas as TABELAS internas do BD[/b:828606afd1]
Estas Tabelas Internas do BD tem Todas as Informaçoes (Triguer , Wiews etc...)

procedure TForm1.FormCreate(Sender: TObject); 
begin 
sqlquery1.setschemainfo(stSysTables,´´,´´); 
clientdataset1.open; 
end;


Para pegar essas Informaçoes novamente se recorremos ao setschemainfo agora usando o parãmetro [b:828606afd1]stNoSchema..[/b:828606afd1]

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); 
var 
  tb: string; 
begin 
  clientdataset2.close; 
  tb := clientdataset1.fieldbyname(´table_name´).asstring; 
  sqlquery2.SQL.CommaText:=´Select * From ´+tb;
  sqlquery2.setschemainfo(stNoSchema,tb,´´); 
  clientdataset2.open; 
end;


para pegar os Parametros da Procedures temos que passar o [b:828606afd1]Nome da Procedure[/b:828606afd1] com clientDataSet Selecionamos Todas as Procedures , e com o ClientDataSet2 Mostramos os Parametros..

procedure TForm1.FormCreate(Sender: TObject); 
begin 
sqlquery1.setschemainfo(stSysTables,´´,´´); 
clientdataset1.open; 
end;


procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); 
var 
  Ptc: string; 
begin 
  clientdataset2.close; 
  ptc := clientdataset1.fieldbyname(´PROC_NAME´).asstring; 
  sqlquery2.setschemainfo(stProcedureParams,ptc,´´); 
  clientdataset2.open; 
end;


:idea: Note que os [b:828606afd1]Indices das Tabelas [/b:828606afd1]pode ser Obtido Direto..

Voce pode fazer Tudo isto em [u:828606afd1]Rum_Time [/u:828606afd1]aonde esses Parametros são passados em por exemplo , clicando em um RadioGoupBox .
Coloque as Opçoes No Items do RadioGroup
Dados , Tabelas , TabelasInternas , Procedures , colunas , ParametrosProcedures , Indices
Nesta Ordem
[u:828606afd1]declarare uma Variavel[/u:828606afd1]
Fvpar:TSchemaType;
No Onclick do Botão faça
Fvpar:=TSchemaType(RadioGroup1.itemIndex);
e Passe para o Método setschemainfo o [b:828606afd1]Tipo Enumerado [/b:828606afd1]desejado
clientDataSet1.close;
sqlquery1.setschemainfo(Fvpar,<???>,´´);
clientDataSet1.open;


e Trabalhe de forma integrada com o outro ClientDataSet ...

Falei demais...


Responder

20/08/2008

Onhide86

Muito Obrigado marco sales, me desse uma boa clareada na memoria com essas dicas ai, obrigado mesmo, abraço.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira