Página 1 de 1

MySQL - erro status E_FAIL

Enviado: 23 Mai 2024 03:36
por cjp
Boa noite a todos.
Tenho recebido há algum tempo este erro:
Error WINOLE/1007 O provedor de dados ou outro serviço retornou um status E_FAIL. (0x80004005): Microsoft Cursor Engine
Já falei com o provedor, que se exime de qualquer problema lá.
E de fato não parece ser problema no provedor propriamente.
Depois de várias pesquisas, verifiquei que este erro está ocorrendo principalmente (ou até exclusivamente) em uma query apenas:

Código: Selecionar todos

SELECT codigo,cotacao,compvenda,conta,nritem,dtcotacao from acoes where status='X' limit 1
Testei a query no HeidiSQL, funciona sem problema.

Alguém poderia me dar alguma luz de como resolver este problema?

MySQL - erro status E_FAIL

Enviado: 23 Mai 2024 08:14
por Itamar M. Lins Jr.
Olá!
O quê que a documentação diz sobre esse erro ?

Saudações,
Itamar M. Lins Jr.

MySQL - erro status E_FAIL

Enviado: 24 Mai 2024 01:41
por cjp
Sinceramente, não sei.
Não consegui achar esta informação na internet.
O chatGPT me deu esta informação:

Código: Selecionar todos

O erro `WINOLE/1007` com o status `E_FAIL` (0x80004005) geralmente indica um problema genérico de falha na interação com o banco de dados, e pode estar relacionado a várias causas possíveis. Aqui estão algumas etapas que você pode seguir para diagnosticar e resolver este problema:

### 1. Verifique a Conexão com o Banco de Dados

Certifique-se de que a conexão com o banco de dados está configurada corretamente e que o servidor de banco de dados está acessível.

```harbour
// Exemplo de conexão com SQL Server usando ADO
oConn := TOleAuto():New( "ADODB.Connection" )
oConn:Open( "Provider=SQLOLEDB;Data Source=SERVER_NAME;Initial Catalog=DATABASE_NAME;User ID=USERNAME;Password=PASSWORD;" )

IF oConn:State <> 1
   MsgStop( "Falha ao conectar ao banco de dados", "Erro de Conexão" )
   RETURN NIL
ENDIF
```

### 2. Verifique a Consulta SQL

Verifique se a consulta SQL está correta e não contém erros de sintaxe. Teste a consulta diretamente no banco de dados usando uma ferramenta como SQL Server Management Studio (SSMS).

```harbour
cSQL := "SELECT * FROM MinhaTabela WHERE Condicao = 'Valor'"
oRs := TOleAuto():New( "ADODB.Recordset" )

BEGIN SEQUENCE
   oRs:Open( cSQL, oConn )
RECOVER
   MsgStop( "Erro ao executar a consulta SQL", "Erro SQL" )
   RETURN NIL
END SEQUENCE

IF oRs:EOF
   MsgInfo( "Nenhum registro encontrado", "Informação" )
ELSE
   WHILE !oRs:EOF
      // Processar registros
      oRs:MoveNext()
   ENDDO
ENDIF

oRs:Close()
```

### 3. Trate Deadlocks e Conflitos de Transação

Se o erro for causado por deadlocks ou conflitos de transação, você pode implementar um mecanismo de retry para tentar executar a transação novamente.

```harbour
LOCAL nRetries := 0
LOCAL lSuccess := .F.

DO WHILE nRetries < 3 .AND. !lSuccess
   BEGIN SEQUENCE
      // Iniciar transação
      oConn:BeginTrans()

      // Executar consulta ou operação
      cSQL := "UPDATE MinhaTabela SET Campo = 'Valor' WHERE Condicao = 'Valor'"
      oConn:Execute( cSQL )

      // Commit transação
      oConn:CommitTrans()
      lSuccess := .T.
   RECOVER USING oError
      // Rollback transação
      oConn:RollbackTrans()

      IF oError:Severity == 13  // Deadlock detected
         nRetries++
         Sleep(1000)  // Aguardar um tempo antes de tentar novamente
      ELSE
         MsgStop( "Erro ao executar a operação: " + oError:Description, "Erro de Transação" )
         RETURN NIL
      ENDIF
   END SEQUENCE
ENDDO

IF !lSuccess
   MsgStop( "Falha ao executar a operação após várias tentativas", "Erro Crítico" )
ENDIF
```

### 4. Verifique as Configurações de Cursor

Certifique-se de que está usando um tipo de cursor adequado para sua operação. Cursors dinâmicos podem causar problemas em determinadas situações.

```harbour
oRs:CursorType := 3  // adOpenStatic
oRs:LockType := 3    // adLockOptimistic
oRs:Open( cSQL, oConn )
```

### 5. Atualize Drivers e Bibliotecas

Certifique-se de que os drivers OLE DB e ADO utilizados estão atualizados. Às vezes, problemas com drivers desatualizados podem causar erros de conexão.

### 6. Verifique Permissões

Certifique-se de que a conta usada para conectar ao banco de dados possui as permissões necessárias para executar a consulta ou operação.

Se seguir essas etapas não resolver o problema, forneça mais detalhes sobre o código que está causando o erro, a configuração do seu ambiente de banco de dados, e as mensagens de erro completas para que possamos fornecer uma ajuda mais específica.
Fiz todo o passo a passo sugerido, creio que nenhum deles ajuda.
Só fiquei em dúvida quanto ao item 3, pois não sei exatamente o que são conflitos de transação. Também no item 4, tenho dúvida sobre o que seria esses cursortype e locktype. Na minha função de conexão, que funciona bem pra tudo, uso cursorlocation. De qualquer forma, de acordo com os testes que fiz, a conexão está funcionando. O erro ocorre na execução da query. Também fiquei na dúvida quanto ao item. Não sei que drivers são estes. Mas seriam eles no provedor ou em cada computador onde o sistema é executado?

Detalhe: a base de dados neste caso é MySQL, não é SQL Server.

MySQL - erro status E_FAIL

Enviado: 24 Mai 2024 13:39
por Itamar M. Lins Jr.
Olá!
https://learn.microsoft.com/en-us/offic ... s-database
Screenshot_20240524_134724.png
Provavelmente vc está abrindo uma conexão já em uso. 3 opção.

Saudações,
Itamar M. Lins Jr.

MySQL - erro status E_FAIL

Enviado: 24 Mai 2024 20:09
por ivanil
Ola,

Quando você coloca uma consulta inocente dessa, solta, não há o que avaliar..

Código: Selecionar todos

SELECT codigo,cotacao,compvenda,conta,nritem,dtcotacao from acoes where status='X' limit 1
Mas imagine o cenário:

Select cotacao from acoes where codigo=1
cotacao := 15

Error: Cotaçao deve ser maior 20;

SELECT codigo,cotacao,compvenda,conta,nritem,dtcotacao from acoes where status='X' limit 1

veja que sua consulta inocente, aqui, geraria um erro, pois você está preso ao cursor anterior;

Não estou dizendo que seja, mas se você não trabalha com transação, (Begin,commit,rollback} está fadado a ocorrer erros de difícil explicação;

Sugestão:
Use e abuse de log: Monitore;


At;

Ivanil

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 00:49
por cjp
Realmente não fui muito claro, desculpe.

Meu sistema está assim:

Código: Selecionar todos

            IF ADOconecta( nProvAcoes, 5 )
                cProc := conexao:Execute( "SELECT codigo,cotacao,compvenda,conta,nritem,dtcotacao from acoes where status='X' limit 1" )
                ...
            Endif
            cProc:Close()
            Conexao:Close()
A função ADOconecta() apenas faz a conexão, usando ADO.

Então, basicamente, eu faço a conexão e, em seguida, já faço a consulta. Portanto, não tem consulta anterior.

Pelos logs dos erros, o erro dá exatamente na linha da consulta (execução do select).

Em todos os demais pontos do meu sistema faço a consulta exatamente da mesma forma, e nunca deu este erro.

Estou desconfiado de um problema nesta tabela específica (já aconteceu antes, embora não com este erro).

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 00:51
por cjp
Provavelmente vc está abrindo uma conexão já em uso. 3 opção.
Como mostrei antes, eu não abro conexão já em uso. Sempre faço uma nova conexão. E depois a fecho.

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 01:06
por Itamar M. Lins Jr.
Olá!
E se uma pessoa abrir o exe novamente ? Será 2 conexões por uma mesma maquina.
Não é apenas conexão é permissão também.
Bem tá ai o pode ser, quem sabe é quem fez o drive/engenho. A M$ diz que são essas as possibilidades.

Saudações,
Itamar M. Lins Jr.

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 09:00
por cjp
Não é o caso, nenhum usuário abre duas vezes o exe.
Mas se um mesmo usuário abre duas instâncias do sistema, cada instância não abre uma conexão distinta?
Quando vc fala em permissão, não se trata dos privilégios do usuário do banco de dados? Neste caso, o usuário está com todos os privilégios.

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 12:05
por JoséQuintas
Já falamos sobre isso várias vezes.
Se continua fazendo igual, vai continuar tendo problemas.

Desde Windows XP a Microsoft limitou half-open connections a poucas conexões.
O limite a partir do XP eram 8 half-open connections.
Antes dele, o limite eram de 67 milhões de conexões. 8 milhões de vezes maior.
Se ficar abrindo e fechando conexões, pode chegar a travar tudo, precisando ate reiniciar o computador pra voltar ao normal.
Não entendo porque esse limite foi reduzido a tão pouco, com máquinas cada vez mais poderosas, mas é assim.

half-open connections, como o nome diz, são conexões "meio-abertas", não consideradas nem abertas e nem fechadas.
Isso inclui conexão iniciando e conexão fechando.
Não é porque deu um CLOSE lá no aplicativo que ela já fechou.

Conexão é uma coisa, recordset é outra, não confunda.

Se atualmente o limite continua sendo 8 ou não, eu não sei, já que o Windows fica abrindo conexões pra tudo.

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 15:22
por cjp
Já tentei manter uma conexão apenas, mas não obtive êxito nisso. Comigo não funciona.
Mas da forma como faço tem funcionado bem pra tudo. Só neste caso está dando problema.
Será que a causa seria mesmo essa?

MySQL - erro status E_FAIL

Enviado: 25 Mai 2024 18:16
por JoséQuintas
cjp escreveu:Já tentei manter uma conexão apenas, mas não obtive êxito nisso. Comigo não funciona.
Depende de que teste fez.
Se está abrindo e fechando, se alterar só num lugar vai acabar com a conexão fechada por outro lugar.
Também tem o teste pra confirmar se está aberta ou fechada.

Confirme se está fechando todos os recordsets, senão sai bagunça, como misturar consultas.
Veja em que situação executa essa query.
Provavelmente não tem a ver com a query, e sim alguma situação durante o uso.

Sei lá também se pode ser o conector.
Não é tudo igual.
Já tive erro que só acontecia com um conector e com outro não, e só com um comando SQL específico, e eventual.

Talvez pensar em algum tipo de log, como por exemplo registrar se o recordset tem conteúdo e quais os campos dele.

Não é erro comum, por enquanto sem referência do que possa ser.
É que pela mensagem, tem a ver com permissões.
Só imagino limitação de usuários, ou coisa pendente, ou algo parecido.
Vai ter que fazer testes aí pra descobrir.

Talvez também registrar o caminho de rotinas do harbour, aquela callstack que costuma mostrar na errorsys.
Serve de referência sobre por onde passou até chegar na rotina do erro, pra ter idéia se é uma situação diferente.

MySQL - erro status E_FAIL

Enviado: 26 Set 2024 02:16
por cjp
Só para informar aqui que resolvi este problema alterando a tabela. Esta tabela já tinha apresentado problemas anteriormente. E agora de novo parece que o problema era mesmo na tabela. Depois que a alterei, não deu mais problemas.
Obrigado a todos.

MySQL - erro status E_FAIL

Enviado: 18 Nov 2024 21:40
por rochinha
Amiguinhos,

cjp habitue-se a acionar as querys acrescentando o nome das tabelas tabelas:

Código: Selecionar todos

SELECT acoes.codigo, acoes.cotacao, acoes.compvenda, acoes.conta, acoes.nritem, acoes.dtcotacao from acoes where acoes.status='X' limit 1
Isto pode evitar pegar uma variavel em memória ou campo de mesmo nome em outra tabela, inclusive tabelas restritas.

MySQL - erro status E_FAIL

Enviado: 19 Nov 2024 00:51
por cjp
Entendido. Obrigado.