Fórum TDBXReader e NULL #419603

09/07/2012

0

Galera,
Estou com um probleminha aqui que nao sei se é um BUG do TDBXREADER ou alguma falha minha:

Tenho uma consulta que retorna o seguinte:
ID IDPAC
24 NULL
26 NULL
27 4994
28 NULL
29 NULL

Mas quando executo essa consulta usando um TDBXReader, os resultados que ele me traz sao os seguintes:
ID IDPAC
24 NULL
26 NULL
27 4994
28 4994
29 4994

É como se ele não limpasse o buffer a cada campo lido, então, no proximo campo, se determinado valor for nulo ele mantem o valor lido anteriormente.

Estou lendo os dados dessa forma:
While DBXREADER.NEXT
BEGIN
id :=  dbxreader.Value[idagenda].AsString
idpac := dbxreader.Value[idpac].asint32);
END

Alguem tem ideia do que pode ser isso?
Cleidson Silva

Cleidson Silva

Responder

Posts

09/07/2012

Cleidson Silva

E mais um detalhe:
Se eu fizer um teste do tipo:

dbxreader.Value[idpac].isnull

Ele retorna true para esses dois ultimos registros.

Eu sei que posso resolver isso facilmente se colocar na instrucao sql algo do tipo:
select coalesce(idpac,0)

Mas isso é algo sério, que pode gerar resultados desastrosos em uma consulta.
Responder

Gostei + 0

09/07/2012

Marco Salles

bem eu não sei como vc esta utilizando a consulta , mas pq vc não tenta utilizando o asinteger mesmo

idpac := dbxreader.Value[idpac].asinteger);

estou falando isto porque estou com um problema issoluvel na multiplocação de dois valores do tipo int64 e o resultado
fica negativo quando os valores utilizados estão dentro da faixa permitido para este Type

[]sds
Responder

Gostei + 0

09/07/2012

Cleidson Silva

Marco,
Já tentei isso mas o erro persiste.
Tentei inclusive, executar e chegar o resultado no proprio server e o resultado continua o mesmo. Estou achando que isso pode ser um BUG do DBEXPRESS.

Só funciona direito quando retorno a consulta através de uma TSQLQUERY.
Mas ainda não sei como executar uma SQLQUERY no cliente, usando a conexao ao banco que está no servidor.
Alguma dica quanto a isso?
Responder

Gostei + 0

09/07/2012

Deivison Melo

Imagino que essa ordenação seja devido ao tipo de dado utilizado internamente para a consulta.

Digamos que vc faz uma instrução sql e deseja ordenar os valores consultados, mas o campo que armazena os valores
númericos é um campo alphanúmerico então sua ordenação ficaria:

Instrução SQL:

select codigo from pedidos
order by codigo

1
10
2
20
3
30


ao invés de

1
2
3
10
20
30

Isso devido ao campo código ter seu tipo varchar(nvarchar) ao invés de ser um number ou integer (int no seu caso). Pois quando guardamos os valores númericos em campos alphanumericos e mandamos ordenar eles ficaram ordenados dessa forma. O que estou achando que ocorreu com seu código, quando falo isso estou me referindo ao âmbito de sistema e não de banco. Vc deveria utilizar tratar como número e não como cadeia de caracteres (como o amigo acima já sugeriu).

Bom, espero ter ajudado, qualquer coisa estou por aqui!


Responder

Gostei + 0

09/07/2012

Cleidson Silva

Deivison,

Como eu disse acima, mesmo tratando como asInteger dá na o mesmo erro.
Só da certo se uso um TSQLQUERY ao inves do DBXREADER.
Responder

Gostei + 0

09/07/2012

Deivison Melo

Pq acha que o coalesce (nvl, decode e etc) pode ser desastrosos no seu código?

Responder

Gostei + 0

09/07/2012

Cleidson Silva

Bem,
Não é o coalesce que é catastrófico.
Eu disse no sentido de usar o coalesce para resolver esse problema aqui e deixar outras consultas por conta do dbxreader, correndo o risco dele retornar esses dados inválidos como está fazendo agora.
Imagine se ele trouxer um valor qualquer pra cada vez que tiver um valor null num campo.
Responder

Gostei + 0

09/07/2012

Deivison Melo

Isso vai depender da sua codificação, aqui usamos nvl e nvl2(e tb o decode, pois usamos oracle) para tratar valores nulos em query´s e não temos problemas (e olhe que trabalho com sistemas hospitalares enormes (ERP Hospitalar). O q pode afetar é a performance de sua aplicação, mas isso também pode ser burlado se ao fizer sua query ir testando e vendo o plan sort (tempo que a query leva para apresentar as informações (resultset).
Responder

Gostei + 0

09/07/2012

Cleidson Silva

Concordo com voce que fazendo algumas simples verificacoes da pra contornar o problema. Só que isso parece ser um erro do dbexpress. Então, talvez ao invés de ter que fazer verificacoes desse tipo no codigo inteiro, seria mais lógico se apenas conseguisse fazer a consulta funcionar da maneira correta não acha?
Responder

Gostei + 0

09/07/2012

Deivison Melo

Multas vezes para fazermos as consultas funcionarem da forma que desejamos temos que usar de expertise na codificação, não digo para vc fazer uma gambiarra (não que não possa, as vezes elas nos salvam), mas entendo que vc quer ver se isso não seria um erro ou bug do componente. Se vc tem realmente tempo para ficar pesquisando por isso e não quer as soluções quem propomos para vc então boa sorte, espero que consiga o que está buscando e depois venha ao forum e poste a solução encontrada para que assim podermos ajudar outros usuários.

Qualquer coisa estou por aqui! Para me chamar basta perguntar no forum!!

Abração!!
Responder

Gostei + 0

11/07/2012

Marco Salles

Vc consegue fazer um dpr simples contendo ua pequena tabela onde possamos simular o seu erro e tentarmos achar um solução o

dá para fazer isto ?? coisa simples
Responder

Gostei + 0

11/07/2012

Deivison Melo

O colaborador acima fez uma ótima sugestão!

Faça isso que a pessoa que conseguir mais rápido disponibilidade para ajudar, tenha certeza que vai ajudar!
Responder

Gostei + 0

11/07/2012

Cleidson Silva

Pronto,

Está ai o exemplo:
https://dl.dropbox.com/u/24767444/DBXREADER2.zip
Responder

Gostei + 0

11/07/2012

Cauê Nishijima

Cleidson e se usar GetString e GetInt32 ao inves de AsString e AsInt32...Estou sem o Delphi aqui, mas amanhã no serviço posso ver qual é o problema pra você.

Abraços
Cauê Nishijima
Responder

Gostei + 0

12/07/2012

Marco Salles

enviei um email para você

Recebeu ???
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar