MySQL - erro status E_FAIL

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

MySQL - erro status E_FAIL

Mensagem por Itamar M. Lins Jr. »

Olá!
O quê que a documentação diz sobre esse erro ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

MySQL - erro status E_FAIL

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

MySQL - erro status E_FAIL

Mensagem 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
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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).
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

MySQL - erro status E_FAIL

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

MySQL - erro status E_FAIL

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

MySQL - erro status E_FAIL

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

MySQL - erro status E_FAIL

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL - erro status E_FAIL

Mensagem por cjp »

Entendido. Obrigado.
Inacio de Carvalho Neto
Responder