Array
(
)

Delphi 2006 ASP.Net

Mfsdiv
   - 24 out 2006

Caros colegas de lista. Sou novato na lista. Trabalho com desenvolvimento em Delphi
Win32 já algum tempo e estamos nos aperfeiçoando em ASP.Net com Delphi. E dentro desta
idéia estamos criando alguns padrões para este novo ambiente.

Neste raciocinio utilizamos a materia do sr. Isaque Pinheiro publicada no nro 67 ( página 21 )
da Clube Delphi como modelo para criação de classes para as tabelas de um projeto teste, logicamente
fazendo as adaptações necessárias ao ambiente Asp.net. Acontece que estamos com
problema da seguinte ordem : No metodo delete de uma classe ( utilizado para executar
o delete de uma linha na tabela ) criamos uma regra que evita que se delete o codigo = 1 da
tabela e se esta situação for encontrada o metodo cria um exceção na classe e aborta
o delete.

No WebForm onde chamamos o metodo nós criamos a classe, chamamos o método e logo
em seguida destruimos a classe ( para limpar os objetos de memoria ) neste momento
a exceção gerada pelo delete se perde e não mais se propaga passando a dar o segte erro
Object reference not set to an instance of an object.

A conclusão que eu cheguei é que pelo fato da exception ter sido criada pela classe
e logo após ter destruido a classe o ambiente se perde e não sabe o que fazer com
a execption gerada.

Porque estou criando a classe, deletando a linha e destruindo a classe ?
Faço isto para manter a regra que em ASP .Net deve tentar manter a conexão de banco
aberta o minimo de tempo aberta possível. ( já visto em outras materias da revista )

Se puderem me dar uma dica do que esta acontecendo agradeceria muito.

Para documentar estou enviando
------------------------------

Método delete da classe
***********************

procedure TEscola.Delete(W_Codigo: String);
begin;

if Convert.ToInt32(W_Codigo) = 1 then
begin
raise EErroClasse.Create(´#Atencao-Impossível excluir escola = 1´);
end;

try
try
begin
if not Assigned(W_Context.Session[´WS_ConnStringDBA´]) then
begin
raise EErroClasse.Create(´Atencao-Escola_OOP - Falta String de Conexão´);
end;
StringConexaoDBA := W_Context.Session[´WS_ConnStringDBA´].ToString;
StringConexaoUSU := W_Context.Session[´WS_ConnStringUSU´].ToString;
AbreConexao;
// Carrega Parametros
W_Params[1].TR_ParamNome := ´@ESC_CD´;
W_Params[1].TR_ParamTipo := ´01´;
W_Params[1].TR_ParamValor := W_Codigo;
W_SQL := (´DELETE FROM Escola WHERE ESC_CDX = @ESC_CD´);
ExecSQL(W_SQL, W_Params, 1);
end;
finally
begin
FechaConexao;
end;
end;
except
raise EErroClasse.Create(´Atencao-Erro na deleção de aluno´);
end;

end;

Chamda ao Método delete da classe
*********************************

procedure TWebForm1.ButtonExcluir_Click(sender: System.Object; e: System.EventArgs);
begin
try
try
begin
WC_Escola := TEscola.Create;
WC_Escola.Delete(TextBoxCd.Text);
end;
finally
WC_Escola.Destroy; ********* Se esta linha for mantida da o erro
********* Object reference not set to an
********* instance of an object, e a exception gerada
********* no metodo delete da classe se perde.

end
except
on E: EErroClasse do
begin
TJavaScriptDirector.AddStartupShowMessage(Self, Copy(E.Message,9,50));
else
begin
raise Exception.Create(´Exceção não esperada´);
end;
end;

Response.Redirect(´SCH020140.aspx´);

end;

Rjun
   - 24 out 2006

Eu tentei implementar esse seu código em Delphi 8, pois não tenho BDS 2006 aqui no momento. Tem certeza que é DESTROY mesmo que você esta usando? E o que aconteceu com o Garbage Collector?

Mfsdiv
   - 25 out 2006

Caro Rogerio, primeiramente obrigado pela resposta.

Sim a minha classe tem um metodo chamado destroy, com relação ao Garbage Collector não dizer nada, ou seja não tenho conhecimento para avaliar o que ele esta fazendo.

No Delphi 8 em seus testes funcionou ?

So para constar abaixo esta o metodo destroy utilizando em minha classe

destructor TEscola.Destroy;
begin
inherited;
// Destroy as instancias das classe usadas nos campos do cliente.
FEsc_Cd.Free;
FEsc_Nm.Free;
FEsc_Nm_Fantasia.Free;
FEsc_CNPJ.Free;
FEsc_End.Free;
FEsc_Bairro.Free;
FEsc_Cep.Free;
FEsc_Cd_Municipio.Free;
FEsc_Uf.Free;
FEsc_Tel.Free;
FEsc_Email.Free;

W_Context.Free; // Libera Context.

end;

Rjun
   - 25 out 2006

Eu so trabalhei com ASP.NET em Delphi uma vez. Trabalho em C# com .NET e normalmente não se destroi classes, uma vez que o Garbage Collector é reponsáel por isso. Bom, no teste que fiz utilizei Classe.Free e funcionou.

Mfsdiv
   - 25 out 2006

Rógerio, você tem razão. O erro era meu, o que aconteceu que a classe TEscola era descendente de uma classe onde era executado todos os comandos de manipulação de dados mas no .destroy desta classe eu estava executando o dispose da conexão utilizada. Mas determinados metodos da classe descendente como era o caso do delete poderia não abrir a conexão então ao dar o .destroy da classe TEscola o .destroy da classe pai era executado gerando o erro. Resumindo na classe pai tinha a chamada a .dispose de uma conexão que não foi aberta. Obrigado pela ajuda.