Blog

All Blog Posts  |  Next Post  |  Previous Post

Curso Rápido TMS Aurelius - FireDAC ou dbExpress?

Thursday, February 28, 2013

No exemplo fornecido no post anterior, nós salvamos uma instância de TCustomer em um banco de dados local SQLite, que foi acessado de forma nativa pelo TMS Aurelius. Vamos alterar um pouco aquele código:
procedure SaveCustomer(Connection: IDBconnection; CustomerName: string);
var
  Manager: TObjectManager;
  Customer: TCustomer;
begin
  Manager := TObjectManager.Create(Connection);
  Customer := TCustomer.Create;
  Customer.Name := CustomerName;
  Manager.Save(Customer);
  Manager.Free;
end;
Para usar a procedure acima e salvar o cliente no banco SQLite, usamos um código similar ao abaixo (linhas não importantes foram removidas):
uses
  {…}, Aurelius.Drivers.SQLite,   Aurelius.SQL.SQLite;

  Connection := TSQLiteNativeConnectionAdapter.Create('test.db');
  SaveCustomer(Connection, 'Jack');
E se quisermos mudar completamente e salvar agora nossos objetos em um banco de dados MySQL, usando dbExpress para conexão? Isso pode ser feito da seguinte forma:
uses
  {…}, Aurelius.Drivers.dbExpress,   Aurelius.SQL.MySQL;

  Connection := TDBExpressConnectionAdapter.Create(SQLConnection1, 'MySQL', False);
  SaveCustomer(Connection, 'Joe');
Note que tirando o código que obtém a interface IDBConnection, todo o resto do código continua o mesmo. E isso permanece verdadeiro para qualquer banco de dados ao qual você queira conectar, usando qualquer biblioteca/componente de conexão, porque tudo que o object manager precisa é de uma interface IDBConnection - o resto do código é indiferente ao banco/componente.

Para obter essa interface IDBConnection, nós usamos um component adapter (TDBExpressConnectionAdapter, declarado na unit Aurelius.Drivers.dbExpress) que recebe nosso componente dbExpress como parâmetro (um componente TSQLConnection de nome SQLConnection1) and retorna a interface. O segundo parâmetro indicate a qual tipo de banco de dados estamos conectando (mais especificamente, qual a sintaxe SQL que o Aurelius deverá usar para executar os comandos SQL). Essa sintaxe, 'MySQL', está disponível desde que você use a unit Aurelius.SQL.MySQL. Finalmente, o terceiro parâmetro (false) indicate que quando a interface IDBConnection for destruída, o componente "adaptado" (SQLConnection1) não deve ser destruído. Opcionalmente você pode passar true nesse parâmetro, o que pode ser útil se você está criando o componente dbExpress de conexão apenas para usar com essa interface do Aurelius.

Agora que a Embarcadero comprou a biblioteca AnyDac e transformou-a no FireDAC, nativo do Delphi, você pode usar essa biblioteca em vez de usar o dbExpress. E pra fazer isso basta apenas alterar algumas linhas de código:
uses
  {…}, Aurelius.Drivers.AnyDac,   Aurelius.SQL.MySQL;

  Connection := TDBExpressConnectionAdapter.Create(ADConnection1, False);
  SaveCustomer(Connection, 'Phil');
Você deve estar se perguntando sobre o segundo parâmetro que indica o tipo de banco (MySQL). Ele pode ser omitido porque os adapters são capazes de identificar automaticamente o tipo de banco que você está usando, a partir dos componentes de conexão usados (Ambos TSQLConnection e TADConnection têm uma propriedade DriverName que o Aurelius usa pra fazer essa detecção).

Outra coisa que é importante ressaltar é que usando o Aurelius, o código fica bem abstrato e flexível. O Aurelius não possui ele próprio parâmetros de conexão ao banco que você precisa configurar, como nome do servidor, senha, etc.. Tudo é configurado no componente que você já está acostumado a usar. Qualquer configuração de conexão ao banco, incluindo parâmetros avançados, estão disponíveis - é só usar o seu componente.

Portanto, se você ainda não sabe se você deve usar FireDac ou dbExpress, você pode usar ambos e trocá-los quando quiser. Não apenas esses dois, mas a versão atual do Aurelius (1.9) também adapters para ADO, Direct Oracle Access, ElevateDB, NexusDB, Absolute Database, FIBPlus, IBObjects, IBX, SQL-Direct, UniDac e UIB (Unified Interbase) e é claro acesso nativo ao SQLite. A documentação do Aurelius fornece os nomes das units e o nome das classes de adapter pra todos esses componentes, no tópico sobre component adapters.

Quanto aos bancos de dados suportados, não estão disponiveis apenas SQLite e MySQL, mas também Firebird, MS SQL Server, Interbase, Oracle, PostgreSQL, Absolute Database, DB2, ElevateDB, NexusDB e SQLite. Os nomes das units e os dialetos (sintaxes) SQL são listados no tópico da documentação “SQL Dialects”.

Para concluir, gostaria de mencionar que além do fato desses componentes e bancos serem suportados pelo Aurelius, eles também são extensivamente testados em cada versão do Aurelius, com todas as combinações possíveis (dbExpress conectando ao SQL Server, AnyDac conectando ao PostgreSQL, e assim por diante). Você pode verificar na documentação qual a versão mínima de cada componente foi testada pelo Aurelius, e quais combinações. Assim, todos os pequenos problems que conhecemos quando lidamos com uma biblioteca diferente de acesso ao banco, foi resolvido no Aurelius, fazendo ele efetivamente eficiente para usar com qualquer banco e qualquer componente, chaveando os bancos, sem problemas de tratamento de blobs, tipos de campos, entre outras coisas que aparecem quando fazemos uma aplicação multi-banco ou quando mudamos a biblioteca de acesso a banco.

Wagner Landgraf




This blog post has not received any comments yet.



Add a new comment

You will receive a confirmation mail with a link to validate your comment, please use a valid email address.
All fields are required.



All Blog Posts  |  Next Post  |  Previous Post