Listar as tabelas de uma base de dados no Delphi
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.
Onhide86
Curtidas 0
Respostas
Marco Salles
19/07/2008
depende do seu componetes de acesso ... Da tecnologia empregada
Voce esta acessando este Banco com que ????
Voce esta acessando este Banco com que ????
GOSTEI 0
Onhide86
19/07/2008
pois é, eu quero listar mas não sei como, tem alguma dica? abraço.
GOSTEI 0
Marco Salles
19/07/2008
edinho_[b:78aca241b9]faccin[/b:78aca241b9] isto com o DbExpress é facim [b:78aca241b9]facim[/b:78aca241b9]
em um formulário coloque os seguintes componentes
os configure Corretamente .. Depois no Objecto Inspector do form
e no evento OnDataChange do DataSource1 Escreva :
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 :
espero ter sido util depois deste Livro...
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...
GOSTEI 0
Onhide86
19/07/2008
Valeu marco, funcionou legal, abraço.
GOSTEI 0
Onhide86
19/07/2008
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.
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.
GOSTEI 0
Marco Salles
19/07/2008
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..
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,´´,´´,´´);
GOSTEI 0
Onhide86
19/07/2008
Agora sim, estava fantando essa parte:
Unit Vcl.SqlExpr
valeu ai, abraço.
Unit Vcl.SqlExpr
valeu ai, abraço.
GOSTEI 0
Onhide86
19/07/2008
Outra coisa Marco, tem como eu listar os indices, chaves primarias, chaves estrangeiras, dominios, etc, com este recurso no dsbexpress.
Obrigado.
Obrigado.
GOSTEI 0
Marco Salles
19/07/2008
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...
GOSTEI 0
Onhide86
19/07/2008
ok, muito obrigado, e boa peixada ai, hehe
GOSTEI 0
Marco Salles
19/07/2008
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]
//definição do Tipo TSchemaType
A outra informação que voce deve ter é sobre o parametro [u:828606afd1]SchemaObjectName[/u:828606afd1] do método
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
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...)
Para pegar essas Informaçoes novamente se recorremos ao setschemainfo agora usando o parãmetro [b:828606afd1]stNoSchema..[/b:828606afd1]
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..
:idea: Note que os [b:828606afd1]Indices das Tabelas [/b:828606afd1]pode ser Obtido Direto..
e Trabalhe de forma integrada com o outro ClientDataSet ...
Falei demais...
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 .
[u:828606afd1]declarare uma Variavel[/u:828606afd1]
No Onclick do Botão faça
e Passe para o Método setschemainfo o [b:828606afd1]Tipo Enumerado [/b:828606afd1]desejado
Coloque as Opçoes No Items do RadioGroup Dados , Tabelas , TabelasInternas , Procedures , colunas , ParametrosProcedures , Indices Nesta Ordem
Fvpar:TSchemaType;
Fvpar:=TSchemaType(RadioGroup1.itemIndex);
clientDataSet1.close; sqlquery1.setschemainfo(Fvpar,<???>,´´); clientDataSet1.open;
e Trabalhe de forma integrada com o outro ClientDataSet ...
Falei demais...
GOSTEI 0
Onhide86
19/07/2008
Muito Obrigado marco sales, me desse uma boa clareada na memoria com essas dicas ai, obrigado mesmo, abraço.
GOSTEI 0