Delphi 5 + BDE/Oracle: ResultSet retorna no máximo 32 colunas (problema para os mais antigos)
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
Curtidas 0
Respostas
Arthur Heinrich
04/05/2023
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.
GOSTEI 0
Arthur Heinrich
04/05/2023
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.
GOSTEI 0