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!