Criando tabelas através dos recursos de metadata do dbExpress no Delphi
Um dos recursos mais legais do dbExpress é a capacidade de criar tabelas, chaves primárias e chaves estrangeiras (foreign keys) através das classes do dbx metadata.
O código abaixo cria 2 tabelas: Country e State, adiciona chave primária em ambas as tabelas e um relacionamento (foreign key) entre as duas, tudo …
procedure CreateSchema(conn: TSQLConnection);
var
Provider: TDBXDataExpressMetaDataProvider;
Country, State: TDBXMetaDataTable;
IdCountryField,
IdField: TDBXInt32Column;
StrField : TDBXUnicodeVarCharColumn;
begin
Provider := DBXGetMetaProvider(conn.DBXConnection);
// Country
Writeln('Creating Table - Country ....................');
Country := TDBXMetaDataTable.Create;
Country.TableName := 'COUNTRY';
IdCountryField := TDBXInt32Column.Create('COUNTRYID');
IdCountryField.Nullable := false;
IdCountryField.AutoIncrement := true;
Country.AddColumn(IdCountryField);
StrField := TDBXUnicodeVarCharColumn.Create('COUNTRYNAME', 50);
StrField.Nullable := False;
Country.AddColumn(StrField);
Provider.CreateTable(Country);
// Set COUNTRYID as Primary Key
AddPrimaryKey(Provider, Country.TableName, IdCountryField.ColumnName);
// Set Unique Index for COUNTRYNAME
AddUniqueIndex(Provider, Country.TableName, StrField.ColumnName);
// State
Writeln('Creating Table - State ....................');
State := TDBXMetaDataTable.Create;
State.TableName := 'STATE';
IdField := TDBXInt32Column.Create('STATEID');
IdField.Nullable := false;
IdField.AutoIncrement := true;
State.AddColumn(IdField);
StrField := TDBXUnicodeVarCharColumn.Create('SHORTNAME', 2);
StrField.Nullable := False;
State.AddColumn(StrField);
StrField := TDBXUnicodeVarCharColumn.Create('STATENAME', 50);
StrField.Nullable := False;
State.AddColumn(StrField);
State.AddColumn(IdCountryField);
Provider.CreateTable(State);
// Set STATEID as Primary Key
AddPrimaryKey(Provider, State.TableName, idField.ColumnName);
// Set Unique Index for STATENAME
AddUniqueIndex(Provider, State.TableName, StrField.ColumnName);
AddForeignKey(Provider, State.TableName, IdCountryField.ColumnName,
Country.TableName, IdCountryField.ColumnName);
FreeAndNil(Provider);
FreeAndNil(Country);
end;
Download do código fontes completo aqui.



Legal o artigo, mas fiquei com uma dúvida.
Sempre vejo em programas como o IbExpert o “Prepared Statement” rodando antes da execução.
Como faço isso com dbx e delphi?
Lucas,
As classes de execução do dbExpress framework e VCL tem o método prepare.
Olá, legal o artigo. Minha duvida é: Em quais situações que isso seria funcional?
Quando sua aplicação precisa atualizar o schema da base de dados, mas o seu software suporta diferentes bancos de dados, com o metadata do dbexpress você não precisa saber como aplicar escrever o script, o dbexpress driver gera o script especifico para cada banco.
Andreano, não encontrei um tópico adequado, contudo gostaria de saber se é possivel conectar o SQL Azure através do DBExpress ?
Obrigado pelo exemplo Andreano. Penso que ficou claro como criar uma tabela com “Provider.CreateTable(Country); “, no entanto isso é só parte da solução, pois se não existir um “Provider.AlterTable(Tabela, Campo);”, essa funcionalidade não serve de muito. A questão é: Como fazer um Alter Table com o metadata? Obrigado
Isto funciona com o Delphi XE/XE2 ?
@Pedro com XE e XE2
Achei muito bom o recurso de METADATA com o Delphi, utilizando o dbExpress. Isso acaba com uma série de problemas com a interoperabilidade de bancos de dados diferentes.
O recurso de criar chaves AutoIncrement é fantástico. Mas, no seu exemplo, via datasnap, é possível recuperar o novo código para o campo “STATEID” após uma inclusão via Client-Server?
IdField := TDBXInt32Column.Create(‘STATEID’);
IdField.Nullable := false;
IdField.AutoIncrement := true;
State.AddColumn(IdField);
Olá!
O framework dbExpress consegue executar CreateTable e DropTable mas, é possível realizar um AlterTable? AlterColumn?
A configuração da estrutura de uma tabela do banco de dados não se resume a criar e dropar colunas e demais…
Andreano, andei pesquisando e não consegui encontar nada a respeito de como retornar as colunas que são chaves primária de uma determinada tabela através dos recursos de MetaData.
Com o MetaData é possível fazer isso?
Olá Andreano,
Com relação a criação funciona muito bem, parabéns pelo exemplo, mas para alteração de tabela e coluna não consegui achar uma solução, tentei da forma abaixo mais recebe uma exceção.
Estou utilizando a versão do XE, gostaria de receber um retorno a respeito.
Abraço Eric Serafim
TTabela = class(TDBXMetaDataTable)
function TBancoDados.TTabela.AlterarTabela: Boolean;
var
metaProvider: TDBXDataExpressMetaDataProvider;
sql: UnicodeString;
begin
metaProvider := nil;
try
try
metaProvider := TDBXDataExpressMetaDataProvider.Create(FOwner.FConexao.DBXConnection);
metaProvider.Open;
sql := metaProvider.MakeAlterTableSql(Self.TableStorage, Self.ColumnsStorage); #1
Result := FOwner.ExecutarScript(sql);
Except
raise;
end;
finally
metaProvider.Free;
end;
end;
#1 – FWriter.MakeSqlAlter(Builder, Table, Columns); #2
#2 – procedure TDBXBaseMetaDataWriter.MakeSqlAlterTable(const Buffer: TDBXStringBuffer; const Table: TDBXTableRow; const Columns: TDBXTable);
Original := Table.OriginalRow; //A exceção ocorre neste método (exception “Unsupported Operation”)