Página 1 de 3
Erro em acesso ao banco de dados com internet lenta
Enviado: 25 Jul 2014 01:00
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?
Erro em acesso ao banco de dados com internet lenta
Enviado: 30 Jul 2014 08:45
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,
Erro em acesso ao banco de dados com internet lenta
Enviado: 30 Jul 2014 12:00
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()?
Erro em acesso ao banco de dados com internet lenta
Enviado: 30 Jul 2014 13:02
por sygecom
Use o TRY
Exemplo:
TRY
dbusearea(.......)
CATCH
Alert('Ops, verifica sua conexão ai....')
END
Erro em acesso ao banco de dados com internet lenta
Enviado: 31 Jul 2014 08:01
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,
Erro em acesso ao banco de dados com internet lenta
Enviado: 31 Jul 2014 14:56
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
Erro em acesso ao banco de dados com internet lenta
Enviado: 31 Jul 2014 18:11
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,
Erro em acesso ao banco de dados com internet lenta
Enviado: 31 Jul 2014 20:23
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.
Erro em acesso ao banco de dados com internet lenta
Enviado: 31 Jul 2014 22:51
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.
Erro em acesso ao banco de dados com internet lenta
Enviado: 05 Ago 2014 00:26
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.
Erro em acesso ao banco de dados com internet lenta
Enviado: 05 Ago 2014 07:25
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,
Erro em acesso ao banco de dados com internet lenta
Enviado: 05 Ago 2014 10:38
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é?
Erro em acesso ao banco de dados com internet lenta
Enviado: 05 Ago 2014 12:19
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,
Erro em acesso ao banco de dados com internet lenta
Enviado: 05 Ago 2014 15:56
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)
Erro em acesso ao banco de dados com internet lenta
Enviado: 09 Ago 2014 23:35
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