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.
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.