GARANTIR DESCONTO

Fórum Conexão em Rede com Dbexpress e Firebird #420953

02/08/2012

0

Boa tarde a todos e chego ao DevMedia pedindo ajuda. Estou com um pequeno problema que vem me tirando o sono. Estou concluindo minha aplicação com Delphi 2010, utilizo o dbexpreess e Firebird. Estou tentando fazer alguns testes na Rede e não estou conseguindo.
Fiz o seguinte: Criei um arquivo INI e no beforeconnect do TSQLconection utilizo o seguinte código:

procedure TF_Cadastro.ConexaoBeforeConnect(Sender: TObject);
var conecta:TIniFile;
begin
try
conecta:= TIniFile.Create(ExtractFilePath(Application.ExeName)+config.ini);
with F_Cadastro.conexao do
begin
Connected:=false;
LoadParamsOnConnect:= true;
DriverName:=conecta.ReadString(DADOS,DRIVER,);
VendorLib :=conecta.ReadString(DADOS,VENDEDOR,);
LibraryName:=conecta.ReadString(DADOS,LIVRARIA,);
ConnectionName := conecta.ReadString(DADOS,CONEXAO,);
Params.Clear;
GetDriverFunc:=Conecta.ReadString(DRIVER,FUNCAO,);
Params.Values[database] := conecta.ReadString(DADOS,DATABASE,);
Params.Values[user_name] := conecta.ReadString(DADOS,USERNAME,);
Params.Values[password] := conecta.ReadString(DADOS,PASSWORD,);
params.Values[commitretain]:= conecta.ReadString(DADOS,COMITE,);
params.Values[sqldialect] :=conecta.ReadString(DADOS,SQL,);
end;
finally
conecta.Free;
end;

end;

Com isto, apago todas as configurações do Object Inspector e minha aplicação roda normalmente. Mas quando levo o executável para outro computador na Rede(wireless) não funciona de jeito nenhum. Ele não reconhece o connectionName(que no meu caso é CANTINHO).Ressalto que nesta máquina cliente tenho o firebird instalado com cofigurações básicas de cliente, tenho também as Dlls : fbclient.dll e dbxfb.dll , também em meu projeto a Unit midas está declarada.

O erro que acontece é este: Exception EOleException in module Sistconsig.exe at 0016b080.Invalid Argument:CANTINHO.

Ou seja, parece que não está reconhecendo o nome da conexão.Ele está dizendo que o Argumento(o nome da conexão no Delphi) é inválido. Se retiro o nome do INI , ele diz que não tem nome. Não sei o porquê disto. Se alguém puder me dar um orientação quanto a isto, agradeceria bastante, pois preciso implementar este projeto em Rede, pois foi pra isso que ele está sendo criado.

Informo também que, não sei se isto é relevante, a arquitetura do computador que uso é 64bits(windows 7) e a do outro computador que utilizei como cliente é 32bits(windows 7).


Já tentei entre 2 computadores de 32 bits(um virtual e outro físico) , mas o problema continuou. Não sei mais o que fazer. Preciso de ajuda. fico no aguardo.


Em tempo, Pra mim é uma grande honra fazer parte desta comunidade.
Sergio Silva

Sergio Silva

Responder

Posts

02/08/2012

Bruno Leandro

olhando a primeira impressao o erro pode ser na propriedade database que deve possuir o caminho do banco de dados ex
c:\sistema\banco.fdb e deveria ser 127.0.0.1:c:\\sistema\\banco.fdb ou 198.168.0.90:c:\\sistema\\banco.fdb algo do genero, faça o teste e estamos a disposição para seu retorno.
Responder

Gostei + 0

03/08/2012

Sergio Silva

Bom dia, Bruno ! Então, o que acontece é que na hora de copiar e colar, fiz errado o código correto é:

procedure TF_Cadastro.ConexaoBeforeConnect(Sender: TObject);
var conecta:TIniFile;
begin
try
conecta:= TIniFile.Create(ExtractFilePath(Application.ExeName)+config.ini);
with F_Cadastro.conexao do
begin
Connected:=false;
LoadParamsOnConnect:= true;
DriverName:=conecta.ReadString(DADOS,DRIVER,);
VendorLib :=conecta.ReadString(DADOS,VENDEDOR,);
LibraryName:=conecta.ReadString(DADOS,LIVRARIA,);
ConnectionName := conecta.ReadString(DADOS,CONEXAO,);
Params.Clear;
GetDriverFunc:=Conecta.ReadString(DRIVER,FUNCAO,);
Params.Values[database] := conecta.ReadString(DADOS,DATABASE,);
Params.Values[user_name] := conecta.ReadString(DADOS,USERNAME,);
Params.Values[password] := conecta.ReadString(DADOS,PASSWORD,);
params.Values[commitretain]:= conecta.ReadString(DADOS,COMITE,);
params.Values[sqldialect] :=conecta.ReadString(DADOS,SQL,);
end;
finally
conecta.Free;
end;

end;

Tem as aspas no final para buscar no arquivo INI . Sim , lá tem o caminho do Banco, tudo certinho : eis aí meu arquivo INI:

[DADOS]
VENDEDOR=fbclient.dll
CONEXAO =CANTINHO
DRIVER =FIREBIRD
FUNCAO =getSQLDriverINTERBASE
LIVRARIA=dbxfb.dll
DATABASE =NOME DO HOST:PARTICÃO:\PASTA\PASTA\ARQUIVO.FDB
USERNAME=SYSDBA
PASSWORD=masterkey
LOGIN=FALSE
COMITE=FALSE
SQL=3
Esta é a secão da configuração de comunicação do dbexpress com o banco. Faço os teste no próprio delphi(pois retirei todas as conexões do object Inpecto e utilizo apenas o arquivo.ini, como já disse anteriormente) e posso alterar outros dados no arquivo.ini que o programa abre normalmente, mas se alterar o nome da conexão ele não aceita e diz que o argumento é inválido e se alterar também os dados do banco no Provide do dbexpress(Dataexplorer), ele também não entra. Até aí tudo bem, mas por que, na rede, ele diz que o connectionName é inválido? Será que falta mais alguma dll pra levar para o outro pc? Instalei o firebird nele com configurações básicas, levei o fbclient.dll e o dbxfb.dll e declarei a unit Midaslib no projeto e também no datamodule do TSQLconnection Talvez esteja esquecendo de levar algum outro arquivo, não sei!
O certo é que estou deixando de fazer alguma coisa ou fazendo algo errado.Só sei que meu problema todo é nesta parte : ConnectionName:= conecta.ReadString(DADOS,CONEXAO,); Na rede, o executável não está reconhecendo o nome da conexão que está no Delphi.
Não há nada que faça este executável Funcionar em outro PC. Se puder me ajudar, agradeceria muito mesmo.
Responder

Gostei + 0

03/08/2012

Deivison Melo

Seguem abaixo exemplos usados com a conexão dbexpress usando o banco de dados firebird...

(*************************************************************************************************************************)
//Procedure para gravar arquivo ini usado no login
//inicio
procedure GravaIni(Arquivo, Sessao, Subsessao, valor: string);
var
ArqIni: TIniFile;
begin
ArqIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + Arquivo);
try
ArqIni.WriteString(Sessao, Subsessao, valor);
finally
FreeAndNil(ArqIni);
end;
end;
//fim
(*************************************************************************************************************************)
//Funcao para ler arquivo ini usado no login
//inicio
function LerIni(Arquivo, Sessao, Subsessao: string): string;
var
ArqIni: TIniFile;
sDirAplicacao: string;
begin
sDirAplicacao := ExtractFilePath(ParamStr(0));
ArqIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + Arquivo);
try
Result := ArqIni.ReadString(Sessao, Subsessao, );
finally
FreeAndNil(ArqIni);
end;
end;
//fim

(*************************************************************************************************************************)
//Lendo o arquivo ini criado (isso no create do formulário onde contém os objetos dbware´s (conexão com banco)) no meu caso
coloquei no datamodule principal que faz a conexão com o banco de dados
//inicio
begin
if not FileExists(sga.ini) then //verificando se o arquivo *.ini existe (usei o nome sga, mas o nome que você pesquisa é o mesmo nome criado)
ChamaForm(TfrmConfiguracao, frmConfiguracao) // essa procedure chama form foi feita para chamar os formularios, disponibilizarei aqui tb!
else
begin
try
with ConexaoDB do //nome do objeto dbconection do dbexpress
begin
Connected := False;
connectionname := PortoBello; //Nome do alias para conexão
drivername := interbase; //mesmo usando o firebird colocar aqui interbase, isso foi feito em delphi 7
getdriverfunc := getSQLDriverINTERBASE;
libraryname := dbexpint.dll;
params.clear;
params.add(drivername=interbase);
params.add(database= + LerInI(sga.ini, DB, caminho));
params.add(rolename=rolename);
params.add(user_name= + LerInI(sga.ini, DB, usuario));
params.add(password= + LerInI(sga.ini, DB, senha));
params.add(servercharset=);
params.add(sqldialect=3);
params.add(blobsize=-1);
params.add(commitretain=false);
params.add(waitonlocks=true);
params.add(errorresourcefile=);
params.add(localecode=0000);
params.add(interbase transisolation=readcommited);
params.add(trim char=false);
vendorlib := gds32.dll;
Connected := true;
end;
except
raise Exception.Create(Verifique se as configurações do arquivo sga.ini estão corretas!);
end;
end;
end;
//fim
(*************************************************************************************************************************)
//Chamar formulário
//inicio
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
begin
{método para chamar form}
Application.CreateForm(aClasseForm, aForm);
try
aForm.ShowModal;
finally
aForm.Free;
end;
end;
//fim
(*************************************************************************************************************************)


Com isso você terá que adaptar para que o caminho do seu banco de dados seja lido do arquivo *.ini criado para o seu sistema
(ler com a função criada)...

forte abraço!

Emanoel Deivison
Recife - PE

Responder

Gostei + 0

03/08/2012

Sergio Silva

Ok, Davison ! Vou fazer as alterações aqui e Posto o resultado. valeu mesmo,muito obrigado!
Responder

Gostei + 0

03/08/2012

Sergio Silva

Ok Davison ! Meu problema foi resolvido. Vocês me ajudaram muito. Mas na verdade o meu problema todo era por causa da dll do firebird . Eu estava tentando trabalhar com uma dll gerado no 64bits , e os outros pcs não estavam aceitando, por isso o fato de não reconhecerem o alias do banco de dados . Depois de sua orientação e de alguns testes que fui fazendo descobri o problema. Montei a busca ao arquivo .ini no Create do DM e não mais no beforeconection , troquei a dll do outro pc e aí tudo funcionou corretamente. Graças a Deus. Já posso realizar meus testes no Sistema , em rede. Talvez o problema que tive seja esclarecedor para muitos colegas que porventura possam passar por isto. um muito Obrigado mesmo. E digo que meu problema foi RESOLVIDO.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar