Esse artigo faz parte da revista Clube Delphi edição 7. Clique aqui para ler todos os artigos desta edição


Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

Acesso a Banco de dados no Delphi 5

 

O Delphi 5 realmente não poderia deixar de ser o tema da seção bugs deste mês. Não, o novo Delphi não está repleto de insetos, como você está imaginando. Muito pelo contrário, a nova ferramenta tem se mostrado um ambiente de trabalho muito estável, em todos os níveis. Durante os 30 dias em que estivemos ministrando workshops sobre as novidades da linguagem, raramente o Delphi apresentou problemas. Porém, o Delphi 5 (assim como 99% dos sistemas atuais), não é bug-free. Os bugs, apesar de parecerem apenas micróbios diante dos insetos do Delphi 4, existem. Esta seção se limita apenas aos problemas encontrados na utilização de acesso a banco de dados com o Delphi. E como sempre, estamos mais uma vez prontos a dedetizar o ambiente para o leitor. Confira!

 

ADO

 

Evento OnFilterRecord

Quando alguma rotina está atribuída a este evento, uma exceção do tipo OLE é acionada.

 

Método GetTableNames

Este método, pertencente ao objeto TADOConnection, não exibe as views criadas no banco de dados. Para isto, o usuário deve utilizar o método OpenSchema.

 

Relacionamento Máster/Detail

Em um relacionamento deste tipo, criado através das propriedades MasterSource e MasterFields, se a tabela filho for fechada, ao ser reaberta o seu link será perdido, e todo o conteúdo da tabela será exibido.

Outro problema com este relacionamento ocorrer se um filtro for aplicado na tabela pai. Caso isto ocorra e a tabela fique vazia, a tabela filho irá exibir todos os registros, ao invés de permanecer vazia.

 

Método CancelBatch

Se a tabela estiver em modo de edição, permanecerá. O desenvolvedor terá que utilizar o método Cancel, antes de CancelBatch.

 

Método ClearFields

Executar este método causará uma exceção. Para realizar esta operação, limpe os campos manualmente.

 

Método Delete

Após deletar todos os registros de um DataSet, se o método CancelBatch for executado, nada será exibido na tabela. Para voltar com os dados, será necessário digitar o código abaixo:

 

ADOTable1.moveFirst;

ADOTable1.First;

 

Método Clear

Executar o método Clear em um campo do tipo Blod, é inútil. Para realmente limpar o campo, é necessário executar a rotina descrita abaixo:

 

ADODataSet1.UpdateCursorPos;

ADODataSet1.Recordset.

FieldByName[‘BlobField’].

Value := Null;

ADODataSet1.Recordset.

Update(EmptyParam,

EmptyParam);

ADODataSet1.Resync([]);

 

Erro aleatório

Os problemas aleatórios são os mais divertidos. Aparecem às vezes e sem motivo aparente. O ADO também tem o seu: inserir um registro em uma tabela com algum campo “lookup” nem sempre irá funcionar.

Existe outro probleminha com esta característica: Os métodos AppendRecord e InsertRecord, executados após o fechamento e reabertura da tabela, podem causar Access Violations.

 

Métodos AppendRecord

Mais uma deste método: executá-lo quando uma DbGrid está conectada a uma tabela vazia irá gerar uma exceção. Use sempre os métodos Insert ou InsertRecord.

 

Evento OnfilterRecord

Atribuir FALSE ao parâmetro Accept deste evento pode travar o sistema, em alguns casos.

 

Propriedade IndexName

Quando esta propriedade é configurada, as propriedades IndexFieldCount e IndexField não são automaticamente atualizadas, como ocorre no objeto Ttable. Para capturar estas informações, utilize a coleção IndexDefs.

 

Método Seek

Chamar este método em um recordset vazio dispara uma OLE Exception, indicando que a tabela está vazia. Verifique a propriedade IsEmpty antes de executar este método.

 

Restrições de Integridade

Após tentar deletar um registro que possua alguma regra de validação, os insetos irão tomar conta e vários errros serão disparados nas ações realizadas em seqüência. Para evitar este incômodo, execute o método CancelUpdates no evento OnDeleteError:

 

ADOTable1.RecordSet.

Cancelupdates;

 

LookUpFields

Quando um dbGrid está linkado com algum campo lookup, é bom evitar que o usuário redimensione ou reposicione o campo. Caso isto aconteça, caracteres estranhos irão aparecer no lugar da informação.

 

Midas

Usar o ADO com a camada Midas também apresenta alguns inconvenientes. Um deles é com o SQL Server. Quando o método ApplyEpdates é executado, por vezes é exibida a mensagem “Record was changed by another user”. Porém, existe apenas um cliente logado no banco.

 

Access

Utilizar o quickReport com o banco de dados access, acessado pelo Driver nativo do BDE causa uma access violation. Será necessário criar uma conexão ODBC ou ADO neste caso.

 

DataModule Designer

O dataDiagram não funciona com todas as impressoras do mercado. Ao imprimir um diagrama, é provável que este não seja impresso corretamente.

 

DBLookUpComboBox

Se o usuário possuir o IntelliMouse, é bom que esteja usando a versão 2.2 Nas versões anteriores, o aplicativo trava quando o botão “wheel” é utilizado dentro de um DBLookupComboBox.

 

SQL Explorer

O aplicativo não exibe o conteúdo de uma tabela de forma correta, se existir algum tipo de lock sobre a mesma. A grade permanecerá em branco enquanto a tabela estiver lockada.

 

MIDAS

Se a tabela conectada possuir um campo Blod com algum conteúdo acima de 11mb, a mensagem “Invalid Pointer operation” é retomada para o cliente, se este executar o método ApplyUpdates seguido de Refresh.

Leituras muito pesadas também estão apresentado inconsistências nesta camada. Após um pesado load de dados a conexão pode falhar ou a mensagem “Server execution error” pode aparecer.

 

Método CloneCursor

O método CloneCursor, do objeto ClientDataSet, apresenta alguns problemas de sincronização.

 

XML

Quando o servidor MIDAS possuir mais de 95 registros na tabela pai, e mais de 830 registros na tabela filho, a aplicação rodando em um browser Netscape irá travar. Se o usuário estiver utilizando o Internet Explorer, o procedimento será normal.

Há um problema comum nos dois browser: tentar atualizar o primeiro registro da tabela filho (em um relacionamento master-detail) irá provocar a mensagem “Record Change by another user”, como resposta para o cliente.

 

Conclusão

 

Como pode-se notar, são erros de gravidade menor e provavelmente não causarão parada de elevadores nem lançamento de mísseis. Até o fechamento desta edição, a Borland ainda não havia divulgado nenhum UpDatePack para o Delphi, mas não deixe de ficar de olho no website do fabricante em http://www.Borland.com/delphi. Se estiver diante de um posível bug e quiser deixar a sua contribuição, basta enviar um e-mail com a sua dica. Até a próxima!