Oi meu nome é julierme carvalho, depois varias vídeos aulas assistidas aqui no site da devmedia muitas vídeos de autores como “GUINTHER PAULI, RODRIGO CARREIRO MOURÃO, RENATO MATOS” resolvi tentar criar um classe de conexão, usando os conhecimentos aqui adquiridos neste site, nesta classe eu uso DbExpress, Firebird e o drive da Core Lab para acesso ao Firebird lembrando que o mesmo é pago, mais lembrando que a classe funciona com qualquer drive de suporte ao Firebird.

Todos os créditos desse artigo são para o Rodrigo Carreiro que cria uma classe desse mesmo modelo, mais para Usuários. Até então eu tinha uma classe de conexão mais que criava toda hora uma conexão o que não é nada recomendado vendo alguns vídeos, ou melhor, todos os vídeos sobre Delphi dele rsrs, em um desses vídeos ele passa este padrão de projeto que resolveu meu problema, a ele e há devmedia meu muito obrigado!! Por que neste modelo de classe sempre é verificado se já existe um conexão caso não exista ele cria caso já tenha ele retorna a mesma conexão.

Aqui esta a unit completa.


unit uConection;
interface
uses DB, SqlExpr, SysUtils, Dialogs, StdCtrls;
type
  TConexao = class
  private
    FConn: TSQLConnection;
    class var FInstance: TConexao;
    function get_conn: TSQLConnection;
    constructor CreatePrivate;
    { private declarations }
  protected
    { protected declarations }
  public
    { public declarations }
    constructor Create;
    property Conn: TSQLConnection read Get_conn;
    class function GetInstance: TConexao;
  published
  { published declarations }
  end;
implementation
{ TConexao }
constructor TConexao.Create;
begin
{: para não poder usar o create da conexão para usar a conexão só usando TConexao.GetInstance.Conn}
  raise Exception.Create('Para obter um instância de TConexao utilize TConexao.GetInstance.Conn!!');
  end;
constructor TConexao.CreatePrivate;
begin
  inherited Create;
  end;

class function TConexao.GetInstance: TConexao;
begin
  try
   {: Verifica se já possui uma conexão}
   if not Assigned(FInstance) then
   begin
    FInstance := TConexao.CreatePrivate;   TConexao.FInstance.FoConn := TSQLConnection.Create(nil);
      with TConexao.FInstance.FoConn do
      begin
        ConnectionName := 'AUTOMACAOCOMERCIAL';
       DriverName := 'InterBase by Core Lab';
        LibraryName := 'dbexpida40.dll';
        VendorLib := 'fbclient.dll';
        GetDriverFunc := 'getSQLDriverInterBase';
        Params.Add('User_Name=SYSDBA');
        Params.Add('Password=masterkey');
        Params.Add('Database=localhost:C:\bancodedados\PDV.FDB');
        LoginPrompt := False;
        Open;
      end;
   end;
     {: sempre retorna FInstance }
     result := FInstance
  except
  {: caso aconteça um erro de conexão o erro é mostrado}
     On E: Exception do
        ShowMessage(E.Message);
  end;
  end;
function TConexao.get_conn: TSQLConnection;
begin
    Result:= FConn;
    end;
    end.

O exemplo acima funciona e muito bem! Mais tem como melhora? Tem sim! Neste exemplo a conexão fica pressa a um único lugar especifico para o bando de dados, como eu poderia passar o caminho do bando de dados dinamicamente? Então eu pensei em usar registro, usando o registro do Windows eu apenas passaria o caminho do banco e pronto caso mude o banco de diretório mudo o caminho só no registro, e minha conexão funcionará normalmente.

A alteração é feita apenas em “Class function” ficando assim agora a Classe.

Nota: A primeira fez que for executada a classe, a conexão não vai funcionar por que não existe o registro, portanto não tendo o caminho do banco execute uma vez e depois passe no registro criado o caminho do banco e pronto conexão estabelecida!

class function TConexao.GetInstance: TConexao;
var
//lembrando de dar uses Registry
  Reg: TRegistry;
  begin
  try
   {: Verifica se já possui um conexão }
   if not Assigned(FInstance) then
   begin
   {: crio a variável para ler do registro}
   Reg := TRegistry.Create;
    FInstance := TConexao.CreatePrivate;
    TConexao.FInstance.FoConn := TSQLConnection.Create(nil);
    {: se não existir ele cria}              
    if Reg.OpenKey('Software\Aplicacao\Conexao',  true) then
      with TConexao.FInstance.FoConn do
      begin
        ConnectionName := 'AUTOMACAOCOMERCIAL';
        DriverName := 'InterBase by Core Lab';
        LibraryName := 'dbexpida40.dll';
        VendorLib := 'fbclient.dll';
        GetDriverFunc := 'getSQLDriverInterBase';
        Params.Add('User_Name=SYSDBA');
        Params.Add('Password=masterkey');
        {: o caminho do banco e lido no registro}
        Params.Add('Database='Reg.ReadString('CAMINHO_BANCO_DADOS'));
        LoginPrompt := False;
        Open;
      end;
   end;
     FreeAndNil(Reg);
     result := FInstance
  except
     On E : Exception do
        ShowMessage(E.Message);
  end;
  end;

Espero que tenham gostado e até o próximo artigo.