sábado, março 08, 2008

DBExpress não sabe contar

No Delphi, eu estava tentando executar uma query, e logo abaixo, eu testava quantos registros a query retornou. A Query simples, uma join de duas tabelas pequenas. Meu sistema é desenvolvido utilizando banco de dados SQL Server, acessado através de componentes DBExpress. Pra qualquer porcaria ( BDE, ADO, Zeos, etc.. ) o recordcount funciona. Menos para DBExpress. Quando eu tento chamar o método Recordcount do TSQLQuery, ele berra, avisando que a operação não é suportada.

Segundo esta explicação da Borland, o recordcount não pode ser obtido se:
- você está executando uma stored procedure;
- você está executando uma view;
- você está executando um script que contém joins entre tabelas;

Resumindo: recordcount never more. Qual sistema que não tem stored procedure, view ou joins ?

Boa sorte desenvolvedor Delphi. Você vai precisar.

4 comentários:

Daniel Maltarolli disse...

RecordCount não funciona no DBExpress porque o TSQLQuery é unidirecional. Diferente de outros datasets, datasets unidirecionais não fazem buffer de múltiplos registros em memória e por isso não podem dizer de antemão quantos registros foram retornados.

Você tem razão em dizer que DBExpress não sabe contar. Inclusive também não sabe fazer insert, update, nem delete. Para isso você precisa de um TClientDataSet ligado a um TDataSetProvider, em uma arquitetura de três camadas de preferência.

Todas as plataformas têm um equivalente a um cursor rápido unidirecional e somente-leitura, inclusive Java e .NET.

Em .NET, por exemplo, a propriedade RecordsAffected da classe SqlDataReader só pode ser acessada depois que o cursor é fechado.

Resumindo, é as designed. :-)

Anderson Ribeiro disse...

Obrigado pela explicação, Daniel. Realmente, pesquisei mais sobre o assunto, e é exatamente como você afirmou.

Porém, considero que seja um erro de design da Borland, uma vez que na interface do TSQLQuery é fornecida a propriedade RecordCount, pois ela é herdada de TDataset. Isso leva muitos programadores ao erro e à dúvida, e esta em particular é muito comum, pesquise no google e você vai ver.

Talvez TSQLQuery não deveria herdar de TDataset. Mas, o pessoal da Borland/CodeGear com certeza tiveram seus motivos para isso.

Anônimo disse...

I just like the helpful info you supply for your
articles. I will bookmark your weblog and test once more right here regularly.
I'm rather sure I'll be told a lot of new stuff proper here!

Good luck for the following!

my web site ... buy followers on instagram

Anônimo disse...

I get pleasure from, result in I found just what I used to
be looking for. You have ended my 4 day long hunt!
God Bless you man. Have a great day. Bye

Visit my blog post how to buy followers on social media service twitter