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”)