Delphi 5 + BDE/Oracle: ResultSet retorna no máximo 32 colunas (problema para os mais antigos)
04/05/2023
0
Caros,
Este problema só os mais antigos "talvez" respondam.
Tenho uma aplicação que foi desenvolvida em 2000, aproximadamente, utilizando Delphi 5. Ela utiliza banco de dados Oracle através do BDE e funciona muito bem, até hoje. Porém, tem algo que sempre me incomodou.
Se eu executo uma query que retorne mais de 32 colunas, ocorre um erro e nenhuma linha é retornada.
Além desse problema, também reparei que, sempre que uma coluna do tipo varchar2 é retornada com mais de 128 caracteres, o BDE a interpreta como sendo do tipo LOB (memo no Delphi) e, por conta disso, retorna apenas 1 linha por fetch, o que torna o acesso aos dados muito mais lento.
Alguém já passou por isso?
Já tentei olhar o código fonte, debugar entrando até nas rotinas em Assembly, mas não é nada simples. Parece ser uma limitação do BDE e, como ele foi descontinuado, não existem atualizações que corrijam estas deficiências. Se é que são deficiências. Pode ser que eu esteja utilizando incorretamente, ou tenha setado algum parâmetro que compromete o funcionamento.
Este problema só os mais antigos "talvez" respondam.
Tenho uma aplicação que foi desenvolvida em 2000, aproximadamente, utilizando Delphi 5. Ela utiliza banco de dados Oracle através do BDE e funciona muito bem, até hoje. Porém, tem algo que sempre me incomodou.
Se eu executo uma query que retorne mais de 32 colunas, ocorre um erro e nenhuma linha é retornada.
Além desse problema, também reparei que, sempre que uma coluna do tipo varchar2 é retornada com mais de 128 caracteres, o BDE a interpreta como sendo do tipo LOB (memo no Delphi) e, por conta disso, retorna apenas 1 linha por fetch, o que torna o acesso aos dados muito mais lento.
Alguém já passou por isso?
Já tentei olhar o código fonte, debugar entrando até nas rotinas em Assembly, mas não é nada simples. Parece ser uma limitação do BDE e, como ele foi descontinuado, não existem atualizações que corrijam estas deficiências. Se é que são deficiências. Pode ser que eu esteja utilizando incorretamente, ou tenha setado algum parâmetro que compromete o funcionamento.
Arthur Heinrich
Curtir tópico
+ 0
Responder
Posts
04/05/2023
Arthur Heinrich
Fiz um teste simples, utilizando os componentes direto no form, utilizando um alias criado manualmente no BDEAdmin e a query retorna mais de 32 colunas.
Porém, quando crio os componentes dinamicamente, sem utilizar um alias previamente, o BDE retorna falta de memória.
Porém, quando crio os componentes dinamicamente, sem utilizar um alias previamente, o BDE retorna falta de memória.
Responder
05/05/2023
Arthur Heinrich
Acho que o meu problema deve estar relacionado a como o BDE controla internamente os caches de blobs, ou mesmo armazena temporariamente as linhas, quando fazemos um fetch de múltiplas linhas.
Eu estava utilizando uma configuração onde:
BLOB SIZE=10240
ROWSET SIZE=1000
BLOBS TO CACHE=16
É possível que haja alguma limitação no tamanho do buffer interno, do tipo, armazenar no máximo 32 K colunas no buffer. Como eu estava forçando a alocação para um fetch de 1000 linhas, isto poderia estar limitando o resultado a no máximo 32 colunas. Mas é claro que isto é só uma suposição.
Reduzi o tamanho do fetch e agora é possível retornar mais de 32 colunas. Também reduzi o número de blobs a serem cacheados.
BLOB SIZE=10240
ROWSET SIZE=200
BLOBS TO CACHE=1
Escolher adequadamente o fetch size é extremamente importante para minimizar o número de vezes que a aplicação precisa acessar o banco e o melhor valor, depende do conteúdo que será retornado pela query. Fazer este ajuste durante a conexão não permite flexibilizar o fetch entre queries distintas.
Eu estava utilizando uma configuração onde:
BLOB SIZE=10240
ROWSET SIZE=1000
BLOBS TO CACHE=16
É possível que haja alguma limitação no tamanho do buffer interno, do tipo, armazenar no máximo 32 K colunas no buffer. Como eu estava forçando a alocação para um fetch de 1000 linhas, isto poderia estar limitando o resultado a no máximo 32 colunas. Mas é claro que isto é só uma suposição.
Reduzi o tamanho do fetch e agora é possível retornar mais de 32 colunas. Também reduzi o número de blobs a serem cacheados.
BLOB SIZE=10240
ROWSET SIZE=200
BLOBS TO CACHE=1
Escolher adequadamente o fetch size é extremamente importante para minimizar o número de vezes que a aplicação precisa acessar o banco e o melhor valor, depende do conteúdo que será retornado pela query. Fazer este ajuste durante a conexão não permite flexibilizar o fetch entre queries distintas.
Responder
Clique aqui para fazer login e interagir na Comunidade :)