dbExpress

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Recuperando os Metadados do Banco, com dbExpress e Guinther Pauli. Acesso Liberado.

Recuperando os Metadados do Banco

 

Neste artigo veremos como utilizar o dbExpress para recuperar informações sobre os Metadados de um banco de dados, usando basicamente o método SetSchemaInfo de TCustomSQLDataSet.

Você pode utilizar esse recurso para obter dados sobre os “objetos” de um banco, como nome de tabelas, colunas, tipos, tamanhos, índices, views, triggers, procedures etc.

dbExpress e MetaDados

Cada banco de dados possui um catálogo, um conjunto de tabelas que armazenam informações sobre o próprio banco de dados. Por exemplo, o DB2 guarda informações sobre TABELAS e COLUNAS em tabelas chamadas SYSTABLES e SYSCOLUMNS. O SQL Server chama de sysobjetcs e syscolumns. O Oracle armazena essas informações em tabelas como USER_TABLES e USER_COLUMNS. O InterBase / Firebird armazena informações em várias tabelas de sistema, iniciando com o prefixo “RDB$”. 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, pois conforme vimos, as tabelas de catálogo possuem nomes e estruturas completamente diferentes.

Sabendo isso, a Borland, quando criou o dbExpress, definiu uma interface para padronizar a obtenção dessas informações, não importa o banco de dados que esteja utilizando. Ou seja, há um padrão, e você não precisará escrever diferentes instruções SQL para obter informações desse tipo quando precisar acessar mais de um tipo de BD.

Dessa forma, cada driver cliente do dbExpress (para DB2, Oracle, IB / FB) deve implementar essa interface para indicar como os metadados de um BD podem ser obtidos, e isso fica transparente ao programador.

Essa interface se chama ISQLMetaData e está declarada na unit DBXpress.pas:

 

ISQLMetaData = interface

function SetOption(eDOption: TSQLMetaDataOption;

PropValue: LongInt): SQLResult; stdcall;

function GetOption(eDOption: TSQLMetaDataOption; PropValue: Pointer;

MaxLength: SmallInt; out Length: SmallInt): SQLResult; stdcall;

function getObjectList(eObjType: TSQLObjectType; out Cursor: ISQLCursor):

SQLResult; stdcall;

function getTables(TableName: PChar; TableType: LongWord;

out Cursor: ISQLCursor): SQLResult; stdcall;

function getProcedures(ProcedureName: PChar; ProcType: LongWord;

out Cursor: ISQLCursor): SQLResult; stdcall;

function getColumns(TableName: PChar; ColumnName: PChar;

ColType: LongWord; Out Cursor: ISQLCursor): SQLResult; stdcall;

function getProcedureParams(ProcName: PChar; ParamName: PChar;

out Cursor: ISQLCursor): SQLResult; stdcall;

function getIndices(TableName: PChar; IndexType: LongWord;

out Cursor: ISQLCursor): SQLResult; stdcall;

function getErrorMessage(Error: PChar): SQLResult; overload; stdcall;

function getErrorMessageLen(out ErrorLen: SmallInt): SQLResult; stdcall;

end;

 

ISQLMetaData é na verdade uma das interfaces básicas do dbExpress. Existem outras, como ISQLConnection, ISQLCommand, ISQLCursor e ISQLDriver, que definem métodos básicos para conexão, execução de comandos, execução de consultas etc. Com isso, o acesso a diferentes BD é algo muito simples de ser feito com dbExpress, visto que os componentes da paleta usam internamente essas interfaces.

Um exemplo simples

Faremos agora um exemplo bastante simples que mostrará como recuperar informações sobre Metadados de um banco do IB. Utilizaremos aqui o banco Employee.gdb dos demos do IB, acessando de uma aplicação Delphi 7 com dbExpress.

Coloque no formulário os componentes mostrados na figura a seguir (para simplificar o exemplo não usaremos um DataModule):

 

Figura1.

Relacione os componentes da seguinte forma:

 

Figura2.

Configure uma conexão ao banco Employee.gdb usando SQLConnection, defina seu LoginPrompt como False e Connected como True.

No evento OnCreate do formulário digite o seguinte:

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  SQLQuery1.SetSchemaInfo(stTables,'','');

  ClientDataSet1.Open;

end;

 

E no evento OnDateChange do DataSource1 digite o seguinte:

 

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;

 

Com isso, exibimos no primeiro DBGrid as tabelas do banco de dados. Quando uma tabela for selecionada, exibimos informações sobre suas colunas no segundo DBGrid. Execute a aplicação:

 

Figura3.

Aqui mostrei como obter informações sobre tabelas e colunas de um BD, mas nada impede que você recupere informações sobre triggers, views, procedures, índices etc. O método SetSchemaInfo aceita um série de parâmetros que permitem recuperar todas as informações necessárias sobre metadados de um BD, de uma forma simples e transparente.

Um abraço a todos e até a próxima!

 

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Ficou com alguma dúvida?