FBDATAREADER.READ() TRAVA
Ola, tenho uma consulta com varios joins:
[Ô]SELECT F.*, [Ô] +
[Ô]B.BAINOME, [Ô] +
[Ô]M.MUNNOME, [Ô] +
[Ô]E.ESTCODI, E.ESTUF, E.ESTNOME, E.ESTICMS, [Ô] +
[Ô]P.PAICODI, P.PAINOME, [Ô] +
[Ô]FN.FUCNOME, [Ô] +
[Ô]H.HORENTMAN, H.HORSAIMAN, H.HORENTTAR, H.HORSAITAR [Ô] +
[Ô]FROM FUNCIONARIO F [Ô] +
[Ô]INNER JOIN BAIRRO B ON (F.BAICODI = B.BAICODI) [Ô] +
[Ô]INNER JOIN MUNICIPIO M ON (F.MUNCODI = M.MUNCODI) [Ô] +
[Ô]INNER JOIN ESTADO E ON (M.ESTCODI = E.ESTCODI) [Ô] +
[Ô]INNER JOIN PAIS P ON (E.PAICODI = P.PAICODI) [Ô] +
[Ô]INNER JOIN FUNCAO FN ON (F.FUCCODI = FN.FUCCODI) [Ô] +
[Ô]INNER JOIN HORARIO H ON (F.HORCODI = H.HORCODI)[Ô];
quando executo ela no IBExpert funciona normal, ja dentro da aplicação, quando executo o FbDataReader.Read() o sistema trava, não da nenhum erro, simplesmente trava.
O que pode ser?
[Ô]SELECT F.*, [Ô] +
[Ô]B.BAINOME, [Ô] +
[Ô]M.MUNNOME, [Ô] +
[Ô]E.ESTCODI, E.ESTUF, E.ESTNOME, E.ESTICMS, [Ô] +
[Ô]P.PAICODI, P.PAINOME, [Ô] +
[Ô]FN.FUCNOME, [Ô] +
[Ô]H.HORENTMAN, H.HORSAIMAN, H.HORENTTAR, H.HORSAITAR [Ô] +
[Ô]FROM FUNCIONARIO F [Ô] +
[Ô]INNER JOIN BAIRRO B ON (F.BAICODI = B.BAICODI) [Ô] +
[Ô]INNER JOIN MUNICIPIO M ON (F.MUNCODI = M.MUNCODI) [Ô] +
[Ô]INNER JOIN ESTADO E ON (M.ESTCODI = E.ESTCODI) [Ô] +
[Ô]INNER JOIN PAIS P ON (E.PAICODI = P.PAICODI) [Ô] +
[Ô]INNER JOIN FUNCAO FN ON (F.FUCCODI = FN.FUCCODI) [Ô] +
[Ô]INNER JOIN HORARIO H ON (F.HORCODI = H.HORCODI)[Ô];
quando executo ela no IBExpert funciona normal, ja dentro da aplicação, quando executo o FbDataReader.Read() o sistema trava, não da nenhum erro, simplesmente trava.
O que pode ser?
Isto está dentro de algum bloco de tratamento?
Mostre como você está resgatando os seu registros, pode ser a forma que os parâmetros foram instanciados.
Mostre como você está resgatando os seu registros, pode ser a forma que os parâmetros foram instanciados.
Não gosto do DataReader pq dá uns pau muito loco.
Uso o DataSet sempre.
Daà vão me falar que o DataReader é mais rápido que o DataSet. Sim, o DataReader é mais rápido que o DataSet mas podemos melhorar o desempenho do DataSet desativando temporariamente algumas das funcionalidades avançadas padrão de um DataSet durante o processamento.
A primeira delas é definir a propriedade - EnforceConstraints - como false ; isto desabilita a verificação das restrições durante a operação e pode tornar a operação mais rápida. Você pode voltar a definir o valor como True depois que os dados forem retornados dentro um loop try/Catch e tratando a exceção ConstraintException.
Outro fator que onera o desempenho de um DataSet é o estabelecimento de uma chave primária. Podemos também desabilitar temporariamente a indexação e notificação interna. Para isto fazemos o seguinte:
1- Executamos o método BeginLoadData antes de usar o método Fill para desabilitar a notificação , indexação.
2- Executamos o método EndLoadData depois de usar o método Fill para habilitar a indexação a notificação.
Estes métodos são membros da classe DataTable e por isso você vai precisar chamá-los para a DataTable particular que você esta preenchendo.
Lembrando que existem outros aspectos negativos em um DataReader que talvez o façam mudar de idéia. Em sistemas multiusuários , enquanto os DataSets/DataAdapters liberam suas conexões e bloqueios assim que o preenchimento via método Fill termina , os DataReaders estão gerenciando a conexão e qualquer bloqueio aberto durante todo o tempo que durar o loop de inspeção de dados. (dr.Read()). Isto pode levar a uma maior contenção do seu banco de dados e com isto diminuir o desempenho .
Uso o DataSet sempre.
Daà vão me falar que o DataReader é mais rápido que o DataSet. Sim, o DataReader é mais rápido que o DataSet mas podemos melhorar o desempenho do DataSet desativando temporariamente algumas das funcionalidades avançadas padrão de um DataSet durante o processamento.
A primeira delas é definir a propriedade - EnforceConstraints - como false ; isto desabilita a verificação das restrições durante a operação e pode tornar a operação mais rápida. Você pode voltar a definir o valor como True depois que os dados forem retornados dentro um loop try/Catch e tratando a exceção ConstraintException.
Outro fator que onera o desempenho de um DataSet é o estabelecimento de uma chave primária. Podemos também desabilitar temporariamente a indexação e notificação interna. Para isto fazemos o seguinte:
1- Executamos o método BeginLoadData antes de usar o método Fill para desabilitar a notificação , indexação.
2- Executamos o método EndLoadData depois de usar o método Fill para habilitar a indexação a notificação.
Estes métodos são membros da classe DataTable e por isso você vai precisar chamá-los para a DataTable particular que você esta preenchendo.
Lembrando que existem outros aspectos negativos em um DataReader que talvez o façam mudar de idéia. Em sistemas multiusuários , enquanto os DataSets/DataAdapters liberam suas conexões e bloqueios assim que o preenchimento via método Fill termina , os DataReaders estão gerenciando a conexão e qualquer bloqueio aberto durante todo o tempo que durar o loop de inspeção de dados. (dr.Read()). Isto pode levar a uma maior contenção do seu banco de dados e com isto diminuir o desempenho .
Tópico encerrado , respostas não são mais permitidas