Olá galera, nesta Quick Tips, irei falar um pouco sobre a nova infra estrutura do DBExpress. A principal Unit que temos no DBExpress é a DBXCommon, vamos criar uma classe para ficar mais prático e organizado, criemos então uma Unit e vamos salvar como uDBExpressTeste.pas

Inicialmente precisamos dar uses em DBXCommon. Vou utilizar o banco de dados Firebird, então automaticamente precisamos dar uses também em DbxFirebird, se formos utilizar o MySQL, daremos uses em DbxMySQL, para o Oracle DbxOracle, SQL Server usamos DbxMSSQL, estes são os principais SGBD`s que temos.

Nota: As units abaixo:

  • DBXFirebird - Versão do Delphi 2010
  • DBXCommon - Versão do Delphi 2007 em diante

Agora vamos adicionar uma classe e algumas propriedades.


unit uDBExpressTest;
 
 interface
 
 uses
  DBXCommon, DBXFirebird, Dialogs, SysUtils;
 
 Type
  TDBExpressTest = Class
  private
  public
  property DBXConn : TDBXConnection;
  property Cmnd : TDBXCommand;
  property Reader : TDBXReader;
  property ConnectionName: String;
  property UserName: String;
  property Password: String;
  procedure ExecuteComand;
 
 End;
 
 Implementation
 
 end.
Listagem 1
Nota: Implemente com CTRL + SHIFT + C;

Descrição das propriedades:

DBXConn Conexão do DBExpress
Cmnd Comando a ser executado do DBExpress
Reader Resulta em uma coleção de dados unidirecional
ConnectionName Informar a conexão do criada no DataExplorer
UserName Informar o usuário do Banco de Dados
Password Informar a senha do Banco de Dados

Vamos implementar a procedure para executar um script simples


procedure TDBExpressTest.ExecuteComand;
 Var
 S : String;
 begin
 //Instanciando a conexão
 FDBXConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection(
 FConnectionName,FUserName, FPassword);
 if FDBXConn <> nil then
 begin
 //Criando o comando para ser executado
 FCmnd := FDBXConn.CreateCommand;
 //Definindo o comando a ser executado
 FCmnd.Text := 'SELECT * FROM CLIENTE';
 //Preparamos o comando para ser executado
 FCmnd.Prepare;
 //Executamos o script anterior
  FReader := FCmnd.ExecuteQuery;
  //Fazemos um Loop para poder pegar os dados resultantes
 while FReader.Next do
 begin
 //Concatenamos os valores da coluna Descricão apenas uma
 //forma de mostrar como pegar o conteúdo armazenado
  S := S +(FReader.Value['DESCRICAO'].GetAnsiString) +#13;
 end;
 //Exibimos os dados resultantes
  S := S + '============================';
 //Retorna a Versão do Servidor de Banco de Dados
  S := S + FDBXConn.ProductVersion;
 //Exibimos os dados resultantes
 ShowMessage(S);
 end;
 end;
Listagem 2

Veja a função GetAnsiString, temos diversas outras função para diferentes tipos de dados.

img

Utilizando o exemplo:


procedure TForm1.BitBtn2Click(Sender: TObject);
 Var
 DBExpressTest : TDBExpressTest;
 begin
 DBExpressTest := TDBExpressTest.Create;
 with DBExpressTest do
 begin
  ConnectionName := 'BDTDS';
  UserName := 'sysdba';
  Password := 'masterkey';
  ExecuteComand;
 end;
 end;
Listagem 3

Quando executamos a procedure ExecteComand, veremos que irá aparecer um ShowMessage com todos os dados do Field Descricao.

Olá galera, nesta Quick Tips, irei continuar falando sobre o novo DBExpress que temos no Delphi.

Veremos como criar comandos de Inclusão, Deleção e Alteração. Utilizando aquela mesma classe, desenvolvida na parte anterior


unit uDBExpressTest;
  
  interface
  
  uses
   DBXCommon, DBXFirebird, Dialogs, SysUtils;
  
  Type
   TDBExpressTest = Class
   private
   public
   property DBXConn : TDBXConnection;
   property Cmnd : TDBXCommand;
   property Reader : TDBXReader;
   property ConnectionName: String;
   property UserName: String;
   property Password: String;
   procedure ExecuteComand;
  {Novos comandos}
   procedure InsertComand;
   procedure UpdateComand;
   procedure DeleteComand;

End;

Implementation

end.
Listagem 4

Vamos agora as implementações de cada Procedure.


InsertComand

procedure TDBExpressTest.InsertComand;
begin
FDBXConn := 
TDBXConnectionFactory.GetConnectionFactory.GetConnection(
FConnectionName,FUserName, FPassword);
if FDBXConn <> nil then
begin
 FCmnd := FDBXConn.CreateCommand;
 FCmnd.Text := 'INSERT INTO CLIENTE (IDCLIENTE, DESCRICAO, 
 SEXO)' +
 'VALUES (11, ' + QuotedStr('WESLEY YAMAZACK') + ', ' + 
 QuotedStr('M') + ') ';
 FCmnd.Prepare;
 FCmnd.ExecuteQuery;
 FCmnd.Close;
end;
end;

<br clear="all">   UpdateComand

procedure TDBExpressTest.UpdateComand;
begin
FDBXConn := 
TDBXConnectionFactory.GetConnectionFactory.GetConnection(
FConnectionName,FUserName, FPassword);
if FDBXConn <> nil then
begin
 FCmnd := FDBXConn.CreateCommand;
 FCmnd.Text := ' UPDATE CLIENTE '+
 ' SET DESCRICAO = ' +QuotedStr('WESLEY Y.') +
 ' WHERE IDCLIENTE = 11';
 FCmnd.Prepare;
 FCmnd.ExecuteQuery;
 FCmnd.Close;
end;
end;


DeleteComand

procedure TDBExpressTest.DeleteComand;
begin
FDBXConn := 
TDBXConnectionFactory.GetConnectionFactory.GetConnection(
FConnectionName,FUserName, FPassword);
if FDBXConn <> nil then
begin
 FCmnd := FDBXConn.CreateCommand;
 FCmnd.Text := 'DELETE FROM CLIENTE ' +
 ' WHERE IDCLIENTE = 11';
 FCmnd.Prepare;
 FCmnd.ExecuteQuery;
 FCmnd.Close;
end;
end;
Listagem 5

Com isso encerro esta segunda parte das dicas do novo DBExpress, porém tem muito mais coisas além destas duas partes que mostrei a vocês, podem notar que na pasta de instalação do Delphi 2010, por exemplo, tem uma pasta com o código fonte das units, veja o caminho, C:\Program Files\Embarcadero\RAD Studio\7.0\source\, para pesquisar mais units, analise nesta pasta.

Olá galera, nesta Quick Tips, irei continuar falando sobre o novo DBExpress que temos no Delphi, vamos ver agora a parte de Transações com o novo DBExpress, veja como é simples trabalhar com transações.

Temos um Objeto do tipo TDBXTransaction, este por sua vez controla as transações que temos. Veja o exemplo com duas tabelas envolvidas, Cliente e TipoCliente observe a imagem abaixo

img

Na procedure DeleteComand, estou executando 3 comandos :

  1. Deletar o IDCliente = 11 , sem problemas
  2. Deletar o IDTipoCliente = 4 , temos problemas pois existe um IDCliente que utiliza este valor 4, ao executarmos irá gerar um erro de restrição de Chave Estrangeira.
  3. Deletar o IDCliente = 12 , sem problemas porém este comando não será executado, devido ao segundo passo ter apresentado um erro.

procedure TDBExpressTest.DeleteComand
  Var
  DBXTrans: TDBXTransaction;
    begin
    FDBXConn := 
    TDBXConnectionFactory.GetConnectionFactory.GetConnection(
    FConnectionName,FUserName, FPassword);
      if FDBXConn <> nil then
      begin
        Try
        {“Startamos” a transação}

        DBXTrans := DBXConn.BeginTransaction(TDBXIsolations.ReadCommitted);

        FCmnd := FDBXConn.CreateCommand;

      {Primeiro Comando}
      FCmnd.Text := 'DELETE FROM CLIENTE ' +
      ' WHERE IDCLIENTE = 11';
      FCmnd.Prepare;
      FCmnd.ExecuteUpdate;
      FCmnd.Close;

      {Segundo Comando}
      FCmnd.Text := 'DELETE FROM TIPOCLIENTE ' +
      ' WHERE IDTIPOCLIENTE = 4’;
      FCmnd.Prepare;
      FCmnd.ExecuteUpdate;
      FCmnd.Close;
      {Terceiro Comando}

      FCmnd.Text := 'DELETE FROM CLIENTE ' +
      ' WHERE IDCLIENTE = 12';
      FCmnd.Prepare;
      FCmnd.ExecuteUpdate;
      FCmnd.Close;

      {“Comitamos” a transação}

      DBXConn.CommitFreeAndNil(DBXTrans);
    Except
    {Roolback na transação quando encontramos um erro}
    DBXConn.RollbackFreeAndNil(DBXTrans);
    ShowMessage('Um Erro ocorreu!!!!');
    End;
  end;
end;
Listagem 6
Nota: Caso você não utilize transações, e se seguir este exemplo você verá que o primeiro script será executado, já o segundo e terceiro não, agora será que é realmente interessante executarmos somente dos scripts ? Esta resposta vocês que tem que saber, utilizar transações torna sua aplicação confiável, pois imagina se você for registrar uma venda, e no meio do registro de itens, tem um item que de alguma forma gera um erro, o que acontece com a sua venda ? Atualização do estoque ? E por ai vai o seu problema, em faze de teste tudo funciona agora quando implementamos a solução numa base de produção os erros começam a aparecer, então muito cuidado com mestre detalhe principalmente. Transação garante sua execução ser 100% confiável.