Listar as tabelas de uma base de dados no Delphi
19/07/2008
0
Onhide86
Posts
19/07/2008
Marco Salles
Voce esta acessando este Banco com que ????
19/07/2008
Onhide86
19/07/2008
Marco Salles
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...
16/08/2008
Onhide86
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.
16/08/2008
Marco Salles
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,´´,´´,´´);
16/08/2008
Onhide86
Unit Vcl.SqlExpr
valeu ai, abraço.
16/08/2008
Onhide86
Obrigado.
16/08/2008
Marco Salles
Tem sim .. De maneira muito fácil...
Depois te respondo pq Hoje sábado vou comer uma peixada...
19/08/2008
Marco Salles
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
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...)
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..
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...
20/08/2008
Onhide86
Clique aqui para fazer login e interagir na Comunidade :)