Erro em acesso ao banco de dados com internet lenta

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:

Erro em acesso ao banco de dados com internet lenta

Mensagem por cjp »

Colegas,

Estou viajando (no Chile), acessando à internet pelo wi-fi do hotel, que é muito, mas muito ruim. Em razão disso, estou tendo bastante dificuldade de acesso ao banco de dados MySQL em meu provedor. Até aí tudo normal.

O problema é que, quando a internet cai, dá erro no programa:

Código: Selecionar todos

Ocorreu o erro: Error SDDODBC/1903  08S01 [MySQL][ODBC 3.51 Driver][mysqld-5.6.10-log]Lost connection to MySQL server during query: 
Também dá pra entender que se perca a conexão ao banco de dados quando a internet cai, obviamente.

Minha dúvida é: será que não tem como evitar que dê erro no programa por isso? A conexão poderia resultar .f., mas não precisaria dar erro no programa.

Minha função está assim:

Código: Selecionar todos

if conexsql()=.f.
            Return .f.
	 endif
         DBUSEAREA( .T.,, "SELECT * FROM recado WHERE visto='S' OR (usuario='I' AND visto='N') LIMIT 10", "recado" )
         ...

function conexsql
         LOCAL nConnection, disconnection
		 local nvz :=0
         RDDSETDEFAULT( "SQLMIX" )
         nConnection := RDDINFO( 1001, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
		 do while .t.
            IF nConnection == 0
			   nvz++
			   if nvz>1
			      @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
			      @ maxrow()-1,1 say "Tentando conexão com o servidor; aguarde..."
			   endif
			   inkey(nvz*2)
			   if nvz>3 .or. (nvz>0 .and. nrtsql>0 .and. ("TAREFAS"$upper(Hb_CmdArgArgV()) .or. "AGENDA"$upper(Hb_CmdArgArgV())))
                  RDDSETDEFAULT( "DBFNTX" )
				  nrtsql++
                  Return .f.
			   endif
			else
			   exit
			endif
		 enddo
return .t.
Tudo que eu preciso é evitar que o programa dê erro. Se não funcionar a conexão, não tem problema.

Outro problema que estou tendo pelo mesmo motivo é que, frequentemente, o programa trava na conexão ao banco de dados. Não retorna .f., mas também não avança. Fica infinitamente travado.

Alguém me ajudaria?
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por Toledo »

cjp escreveu:O problema é que, quando a internet cai, dá erro no programa
Bom, se este erro for dentro da função DBUSEAREA(), não sei dizer se existe alguma maneira de evitar a apresentação da mensagem de erro, pois será um erro interno da função.
Uma saída seria verificar se tem conexão com a Internet antes de usar a função onde está ocorrendo o erro, usar por exemplo está função:

Código: Selecionar todos

Function IsConnected()
local nFlags := 0, lRet := .f.
if CallDll32( "InternetGetConnectedState", "WININET.DLL", @nFlags, 0 ) == 1
  if CallDll32( "InternetCheckConnection", "WININET.DLL", "http://www.google.com",1,0) == 1
    lRet := .t.
  endif
endif
RETURN lRet
cjp escreveu:Outro problema que estou tendo pelo mesmo motivo é que, frequentemente, o programa trava na conexão ao banco de dados. Não retorna .f., mas também não avança. Fica infinitamente travado.
Observando o seu código postado na mensagem anterior, notei que você criou uma função (conexsql()) para fazer a conexão.

Código: Selecionar todos

function conexsql
  LOCAL nConnection, disconnection
  local nvz :=0
  RDDSETDEFAULT( "SQLMIX" )
  nConnection := RDDINFO( 1001, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
  do while .t.
    IF nConnection == 0
      nvz++
      if nvz>1
        @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
        @ maxrow()-1,1 say "Tentando conexão com o servidor; aguarde..."
      endif
      inkey(nvz*2)
      if nvz>3 .or. (nvz>0 .and. nrtsql>0 .and. ("TAREFAS"$upper(Hb_CmdArgArgV()) .or. "AGENDA"$upper(Hb_CmdArgArgV())))
        RDDSETDEFAULT( "DBFNTX" )
        nrtsql++
        Return .f.
      endif
    else
      exit
    endif
  enddo
return .t.
Na linha 5, você está tentando fazer a conexão com o banco de dados, que retorna um valor para nConnection. Depois na linha 6 você abre um Do While e fica num Loop verificando o valor da nConnection, só que em nenhum lugar dentro do Do While você tenta fazer novamente a conexão com o banco de dados, neste caso nConnection nunca vai mudar o seu valor e por este motivo que você está achando que "Fica infinitamente travado".

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por cjp »

Realmente estava errada a função conexsql(), já corrigi.

Agora o outro problema é sim na dbusearea(). Quando não tem internet não tem problema, porque a conexsql() já retorna .f. e ele nem tenta a dbusearea(). O problema é quando a internet está ruim. Daí, ocorre de a conexsql() retornar .t. e a internet cair logo em seguida. Testar a internet antes da dbusearea() não resolveria, pois a conexsql() já testou e retornou .t.

Será que existe algum jeito de alterar a função dbusearea()?
Inacio de Carvalho Neto
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por sygecom »

Use o TRY
Exemplo:
TRY
dbusearea(.......)
CATCH
Alert('Ops, verifica sua conexão ai....')
END
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por Toledo »

cjp escreveu:Será que existe algum jeito de alterar a função dbusearea()?
Bom, ai já não é assunto para este fórum, o correto é no grupo de desenvolvedores do Harbour.
sygecom escreveu:Use o TRY
Verdade, bem lembrado! Mas TRY...CATCH é para xHarbour, com o Harbour tem que usar o BEGIN SEQUENCE...RECOVER.

Exemplo:

BEGIN SEQUENCE
dbusearea(.......)
RECOVER
Alert('Ops, verifica sua conexão ai....')
ENDSEQUENCE

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Erro em acesso ao banco de dados com internet lenta

Mensagem por Nascimento »

Amigo toledo testei sua funçao acima so retorna a .f.

será que estou errando em algo?

Código: Selecionar todos

Proc main()
cls
if IsConnected()

?' TEM NET !!!'

else
?IsConnected()
?' :( NAO TEM NET'

endif


Function IsConnected()
local nFlags := 0, lRet := .f.
if CallDll32( "InternetGetConnectedState", "C:\WINDOWS\system32\WININET.DLL", @nFlags, 0 ) == 1
  if CallDll32( "InternetCheckConnection", "C:\WINDOWS\system32\WININET.DLL", "https://www.google.com",1,0) == 1
    lRet := .t.
  endif
endif
RETURN lRet
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por Toledo »

Amigo Josivan, eu uso este código em um programa MiniGui e funciona perfeitamente.

Em um outro tópico já discutimos sobre esta função, inclusive fiz algumas alterações nela para evitar usar a hbmisc.lib do Harbour, mas você não deu retorno se testou a função.

https://pctoledo.org/forum/viewto ... =60#p86762

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro em acesso ao banco de dados com internet lenta

Mensagem por Jairo Maia »

Olá Pessoal,

Se a ideia é apenas testar se está conectado, uma forma que acho muito boa é desta forma:

Código: Selecionar todos

/*
  Compilar: Hbmk2 exemplo.prg -lxhb
*/

Func Main()
 ? IConectada()
Return Nil

Func IConectada( cAddress )  // Se cAddress = Nil, por padrão checa o google
Local aHosts
InetInit()
If cAddress == Nil
 cAddress := "www.google.com.br"
EndiF
aHosts := InetGetHosts( cAddress )
IF aHosts == NIL .or. len(aHosts)=0
 InetCleanup()
 Return .f.
endif
InetCleanup()
Return .t.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Erro em acesso ao banco de dados com internet lenta

Mensagem por Nascimento »

sim amigo toledo para nao mudar o assunto inicial do topico as funçoes que vc fez no outro topico mesmo sem net mais estando conectada simplismente ao hub retornava a .t.
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por cjp »

Caro Toledo,

Não estou mais viajando, não tenho como testar mais se com a internet lenta vai dar problema ou não.

Mas fiz um teste simulando um erro proposital dentro do begin sequence, assim:

Código: Selecionar todos

begin sequence
repl agenda with "a"
recover
?"Erro"
inkey(10)
endsequence
Sendo que nenhuma base de dados está em uso, naturalmente daria erro. Só que ele está chamando o errorsys, não está caindo no recover.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por Toledo »

Desculpe, precisa de um desvio do errorsys, então faça assim:

Código: Selecionar todos

  bError := ErrorBlock( {|e| Break(e) } )
  begin sequence
    repl agenda with "a"
  recover
    ?"Erro"
    inkey(10)
  endsequence
  ErrorBlock( bError )
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por cjp »

Funcionou. Obrigado.

Isto é uma excelente alternativa para evitar erro no programa. O problema é que tem que colocar isto ponto a ponto, né? Não dá pra fazer isso de forma geral, né?
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por Toledo »

cjp escreveu:Não dá pra fazer isso de forma geral, né?
Bom, você poderia colocar no seu programa inicial, no menu principal, fazendo a chamada dos outros PRG no menu dentro do BEGIN SEQUENCE, mas ai qualquer erro que ocorrer você vai ficar sem saber o que está ocorrendo, pois o errorsys não será executado.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro em acesso ao banco de dados com internet lenta

Mensagem por alxsts »

Olá!

Pode-se tratar todos os erros conhecidos no bloco RECOVER e se não for nenhum deles, tratar genericamente usando o ErrorSys:

Código: Selecionar todos

#define ERR_ERR1  50001
#define ERR_ERR2  50002
#define ERR_ERR3  50003

LOCAL bError := ErrorBlock( {|e| Break(e) } )
LOCAL oErr

BEGIN SEQUENCE
   repl agenda with "a"
RECOVER USING oErr
   DO CASE
      CASE oErr:genCode == ERR_ERR1
         ? "Erro", ERR_ERR1, oErr:description
      CASE oErr:genCode == ERR_ERR2
         ? "Erro", ERR_ERR2, oErr:description
      CASE oErr:genCode == ERR_ERR3
         ? "Erro", ERR_ERR3, oErr:description
      OTHER
         Eval( bError, oErr )
   ENDCASE

   Inkey(10)
ENDSEQUENCE

ErrorBlock( bError )
(Não testei este código)
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Erro em acesso ao banco de dados com internet lenta

Mensagem por sygecom »

Outra opção é tratar o erro no Errorsys.prg

Código: Selecionar todos

   IF oError:genCode == EG_NOFUNC // não achou a função dentro do sistema
      cMessage:='Erro: ' + ErrorMessage( oError )
      TEXTO_ERRO_PADRAO(@cMessage)
      cLogFile := 'error_'+DTOS(DATE())+StrTran( TIME(), ":", "_")
      MemoWrit( cLogFile+".log", cMessage )

      IF MY_MsgYesNo('Atenção !!! O Sistema encontrou um comportamento estranho com a falta de uma rotina, deseja enviar esse erro para Sygecom agora ?'+ HB_OsNewLine()+;
                     cMessage,30)
         ENVIA_ERRO()
      ENDIF
      RETURN .T.
   ENDIF

   IF oError:genCode == EG_NOALIAS  // NÃO ACHOU O ALIAS ENTÃO ABRE O BANCO COMPARTILHADO
         IF Use_Arq(oError:operation,oError:operation,.T.,.F.,.F.,.T.)=.T.
            RETURN .T.
         ENDIF
   ENDIF
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder