Eventos no DataSnap 2009
Olá pessoal ...
Eu estou migrando meus sistemas multi-camadas do D7 para o D2009, no D7 ia no TypeLibrery coloca meus procedimentos e funções, com parâmetros ou não e funcionava tudo direitinho, quando fui para o D2009 as coisas são bem diferentes, achei melhor e mais pratico o uso ou do componente ou do proxy,
preferi optar pelo proxy, achei melhor de dar suporte, consegui usar as funções chamar os métodos sem problema.
O problema ta quando a um erro, pois os meus SQL são sempre no Servidor, no D7 quando avia um erro, eu retornava um valor dependendo do caso ou um false, um null, tinha um try/except, e funcionava direitinho, so que agora usando o D2009 fui testar minha função de erros, coloquei um select errado quando vai abrir a query ele para no .open da query e mostra o erro no cliente, um erro que eu não mandei mostrar, pq se der erro, eu iria so mandar um false, para o meu client, e no servidor não chega no except, o mais intrigante é isto é que esta parando no .open, não estou sabendo como resolver, eu não posso mostrar este erro ao Sistema Client, pq se não trava o meu processo e esse sistema não tem operador, é controlado remotamente.
Fui debugar a minha unit do proxy Client, e ele chega no ExecuteUpdate e trava não chega no result.
Aproveitando este topico gostaria de tirar outra duvida, estou tentando colocar um timeout para fechar um conexão inativa, so que não consegui, eu vi DSTCPServerTransport tem um procedimento RemoveConnection so que não consegui usar, pois ele pede um DBConnectionHandler e não to conseguindo capturar ...
desde ja agradeço.
Eu estou migrando meus sistemas multi-camadas do D7 para o D2009, no D7 ia no TypeLibrery coloca meus procedimentos e funções, com parâmetros ou não e funcionava tudo direitinho, quando fui para o D2009 as coisas são bem diferentes, achei melhor e mais pratico o uso ou do componente ou do proxy,
preferi optar pelo proxy, achei melhor de dar suporte, consegui usar as funções chamar os métodos sem problema.
O problema ta quando a um erro, pois os meus SQL são sempre no Servidor, no D7 quando avia um erro, eu retornava um valor dependendo do caso ou um false, um null, tinha um try/except, e funcionava direitinho, so que agora usando o D2009 fui testar minha função de erros, coloquei um select errado quando vai abrir a query ele para no .open da query e mostra o erro no cliente, um erro que eu não mandei mostrar, pq se der erro, eu iria so mandar um false, para o meu client, e no servidor não chega no except, o mais intrigante é isto é que esta parando no .open, não estou sabendo como resolver, eu não posso mostrar este erro ao Sistema Client, pq se não trava o meu processo e esse sistema não tem operador, é controlado remotamente.
Fui debugar a minha unit do proxy Client, e ele chega no ExecuteUpdate e trava não chega no result.
Aproveitando este topico gostaria de tirar outra duvida, estou tentando colocar um timeout para fechar um conexão inativa, so que não consegui, eu vi DSTCPServerTransport tem um procedimento RemoveConnection so que não consegui usar, pois ele pede um DBConnectionHandler e não to conseguindo capturar ...
desde ja agradeço.
Jcleytonb
Curtidas 0
Respostas
Brunolspp
25/06/2009
nao entendi muito bem..
voce poderia postar um exemplo ou passo a passo de como reproduzir a situacao?
abs
BL
voce poderia postar um exemplo ou passo a passo de como reproduzir a situacao?
abs
BL
GOSTEI 0
Jcleytonb
25/06/2009
vou explicar melhor ...
a primeira situação é assim eu tenho uma função
function TSDSClassPrincipal.mtd_sqi(const sSQL: String): Integer;
var
qry: TZQuery;
s: String;
begin
qry:= TZQuery.Create(nil);
qry.Connection:= DModuloSDS.ZConJCS_BDSDS;
qry.SQL.Add(sSQL);
try
qry.Open;
Result:= qry.Fields[0].AsInteger;
except on e: exception do
begin
Result:= -1;
frmPrincipal.Excecoes(sTipo, sCodigo + ´ - ´ + sDescricao, ´TSDSClassPrincipal.mtd_sqi´, e.Message);
end;
end;
qry.Free;
end;
essa função é uma função simples, que me retorna um inteiro eu passo um select qualquer e é retornado um valor inteiro. Essa função esta no meu TDSServerModule.
Se o select que eu mandar não for válido ou por algum motivo eu não consegui abrir essa query eu retorno para quem solicita esta função o valor -1.
No Sistema Cliente eu tenho a chamada
var
SDSClassPrincipal: TSDSClassPrincipalClient;
iCompRemoto: integer;
begin
SDSClassPrincipal:= TSDSClassPrincipalClient.Create(SQLConSDS.DBXConnection);
iCompRemoto:= SDSClassPrincipal.mtd_sqi(´SELECT CCO__ID FROM TSDSCCO WHERE CCO__ID = ´ + QuotedStr(IntToStr(iCompLocal)));
e tenho a função gerada pelo meu TSQLConnection
function TSDSClassPrincipalClient.mtd_sqi(sSQL: string): Integer;
begin
if Fmtd_sqiCommand = nil then
begin
Fmtd_sqiCommand := FDBXConnection.CreateCommand;
Fmtd_sqiCommand.CommandType := TDBXCommandTypes.DSServerMethod;
Fmtd_sqiCommand.Text := ´TSDSClassPrincipal.mtd_sqi´;
Fmtd_sqiCommand.Prepare;
end;
Fmtd_sqiCommand.Parameters[0].Value.SetWideString(sSQL);
Fmtd_sqiCommand.ExecuteUpdate;
Result := Fmtd_sqiCommand.Parameters[1].Value.GetInt32;
end;
que é chamada desta função.
Quando eu faço a chamada para receber o valor inteiro ocorre tudo certo se o meu sql estiver correto, se alterar este sql ele deveria me retornar o valor -1 que é o valor que eu adotei como padrão quando não existir no caso de inteiro.
só que quando ele chega na linha qry.Open ele para não vai para o except no meu metodo que está no servidor e aparece uma mensagem de erro no Sistema Cliente, mensagem está que eu não quero que apareça. e ele fica no Fmtd_sqiCommand.ExecuteUpdate; e não passa para o Result.
desde já agradeço pela atenção ... e o retorno ...
até mais.
a primeira situação é assim eu tenho uma função
function TSDSClassPrincipal.mtd_sqi(const sSQL: String): Integer;
var
qry: TZQuery;
s: String;
begin
qry:= TZQuery.Create(nil);
qry.Connection:= DModuloSDS.ZConJCS_BDSDS;
qry.SQL.Add(sSQL);
try
qry.Open;
Result:= qry.Fields[0].AsInteger;
except on e: exception do
begin
Result:= -1;
frmPrincipal.Excecoes(sTipo, sCodigo + ´ - ´ + sDescricao, ´TSDSClassPrincipal.mtd_sqi´, e.Message);
end;
end;
qry.Free;
end;
essa função é uma função simples, que me retorna um inteiro eu passo um select qualquer e é retornado um valor inteiro. Essa função esta no meu TDSServerModule.
Se o select que eu mandar não for válido ou por algum motivo eu não consegui abrir essa query eu retorno para quem solicita esta função o valor -1.
No Sistema Cliente eu tenho a chamada
var
SDSClassPrincipal: TSDSClassPrincipalClient;
iCompRemoto: integer;
begin
SDSClassPrincipal:= TSDSClassPrincipalClient.Create(SQLConSDS.DBXConnection);
iCompRemoto:= SDSClassPrincipal.mtd_sqi(´SELECT CCO__ID FROM TSDSCCO WHERE CCO__ID = ´ + QuotedStr(IntToStr(iCompLocal)));
e tenho a função gerada pelo meu TSQLConnection
function TSDSClassPrincipalClient.mtd_sqi(sSQL: string): Integer;
begin
if Fmtd_sqiCommand = nil then
begin
Fmtd_sqiCommand := FDBXConnection.CreateCommand;
Fmtd_sqiCommand.CommandType := TDBXCommandTypes.DSServerMethod;
Fmtd_sqiCommand.Text := ´TSDSClassPrincipal.mtd_sqi´;
Fmtd_sqiCommand.Prepare;
end;
Fmtd_sqiCommand.Parameters[0].Value.SetWideString(sSQL);
Fmtd_sqiCommand.ExecuteUpdate;
Result := Fmtd_sqiCommand.Parameters[1].Value.GetInt32;
end;
que é chamada desta função.
Quando eu faço a chamada para receber o valor inteiro ocorre tudo certo se o meu sql estiver correto, se alterar este sql ele deveria me retornar o valor -1 que é o valor que eu adotei como padrão quando não existir no caso de inteiro.
só que quando ele chega na linha qry.Open ele para não vai para o except no meu metodo que está no servidor e aparece uma mensagem de erro no Sistema Cliente, mensagem está que eu não quero que apareça. e ele fica no Fmtd_sqiCommand.ExecuteUpdate; e não passa para o Result.
desde já agradeço pela atenção ... e o retorno ...
até mais.
GOSTEI 0
Jcleytonb
25/06/2009
Olá pessoal consegui resolver, não sei se é da melhor forma possível, mais coloquei safecall na chamada do meu metodo e funcionou ele me retornou -1.
function mtd_sqi(const sSQL: String): integer; safecall;
obrigado.
function mtd_sqi(const sSQL: String): integer; safecall;
obrigado.
GOSTEI 0
Jcleytonb
25/06/2009
ficou faltando a minha outra duvida que é sobre como desconectar uma conexão tipo,
Exemplo ... eu tenho um TDSServer e TDSTCPServerTransport, tenho TDSServerClass que é ligado a minha Class ... ate ai tudo bem ... mais por exemplo se a internet do meu Cliente cai ou alguém puxa o fio da internet, a minha conexão que fica como se estivesse ativa ... eu queria saber com estes componentes, como eu poderia colocar um verificador, para cer se a conexão responde e como desativar so a conexão inativa ....
obrigado.
Exemplo ... eu tenho um TDSServer e TDSTCPServerTransport, tenho TDSServerClass que é ligado a minha Class ... ate ai tudo bem ... mais por exemplo se a internet do meu Cliente cai ou alguém puxa o fio da internet, a minha conexão que fica como se estivesse ativa ... eu queria saber com estes componentes, como eu poderia colocar um verificador, para cer se a conexão responde e como desativar so a conexão inativa ....
obrigado.
GOSTEI 0
Brunolspp
25/06/2009
a melhor forma e mapear as mensgens centralizadas atraves do application events, no evento onexception, o erro de rede sera levantado e por la vc pode capturar e tratar semn perder os dados e a transacao do momento.
no meu link de downloads tem alguns exemplos que poderão ajudar.
http://cc.embarcadero.com/author/795118
abs
BL
no meu link de downloads tem alguns exemplos que poderão ajudar.
http://cc.embarcadero.com/author/795118
abs
BL
GOSTEI 0
Jcleytonb
25/06/2009
Obrigado pela dica ...
tem varios exemplos poderia me informar qual eu poderia baixar para ver essa situação ?
tem varios exemplos poderia me informar qual eu poderia baixar para ver essa situação ?
GOSTEI 0
Jcleytonb
25/06/2009
fazer melhor ... vou baixar vários ;)
mais uma vez obrigado pela força.
mais uma vez obrigado pela força.
GOSTEI 0
Brunolspp
25/06/2009
o ultimo exemplo que postei sobre Delphi 2009 tem este tipo de tratamento de erro.
mais informação voce também encontra no NDDV, grupo que mantenho a mais de anos sobre multi-camadas http://www.yahoogrupos.com.br/group/nddv
e no site www.istudar.com.br
abs
BL
mais informação voce também encontra no NDDV, grupo que mantenho a mais de anos sobre multi-camadas http://www.yahoogrupos.com.br/group/nddv
e no site www.istudar.com.br
abs
BL
GOSTEI 0