Clipper On Line • Ver Tópico - Erro em acesso ao banco de dados com internet lenta

Erro em acesso ao banco de dados com internet lenta

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Erro em acesso ao banco de dados com internet lenta

Mensagempor cjp » 25 Jul 2014 01:00

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:

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:

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Toledo » 30 Jul 2014 08:45

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:

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.
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
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor cjp » 30 Jul 2014 12:00

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor sygecom » 30 Jul 2014 13:02

Use o TRY
Exemplo:
TRY
dbusearea(.......)
CATCH
Alert('Ops, verifica sua conexão ai....')
END
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7017
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 133 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Toledo » 31 Jul 2014 08:01

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 de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Nascimento » 31 Jul 2014 14:56

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

será que estou errando em algo?

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 de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Toledo » 31 Jul 2014 18:11

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.

http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=14691&start=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 de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Jairo Maia » 31 Jul 2014 20:23

Olá Pessoal,

Se a ideia é apenas testar se está conectado, uma forma que acho muito boa é desta forma:
/*
  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 de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Nascimento » 31 Jul 2014 22:51

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
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor cjp » 05 Ago 2014 00:26

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:

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Toledo » 05 Ago 2014 07:25

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

  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
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor cjp » 05 Ago 2014 10:38

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor Toledo » 05 Ago 2014 12:19

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
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor alxsts » 05 Ago 2014 15:56

Olá!

Pode-se tratar todos os erros conhecidos no bloco RECOVER e se não for nenhum deles, tratar genericamente usando o ErrorSys:
#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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Erro em acesso ao banco de dados com internet lenta

Mensagempor sygecom » 09 Ago 2014 23:35

Outra opção é tratar o erro no Errorsys.prg
   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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7017
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 133 vezes

Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro