Obrigado, Toledo. Mas, infelizmente, ainda não funcionou. Está retornando .F. neste comando:
if !RDDINFO( 1002,,, nConnection)
E eu estou conferindo o nConnection, está certo.
Eu fiz o seguinte programinha de teste:
#include "inkey.ch"
#include "hbgtinfo.ch"
#include "dbinfo.ch"
#define RDDI_CONNECT 1001
#define RDDI_DISCONNECT 1002
#define RDDI_EXECUTE 1003
REQUEST SQLMIX, SDDODBC, DBFNTX
ANNOUNCE RDDSYS
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
*REQUEST HB_Codepage_PTISO
PROCEDURE Main
do while .t.
private nConnection
if conexsql()
?nConnection
if !RDDINFO( 1002,,, nConnection)
?"Não desconectou"
else
?"Desconectou"
endif
?nConnection
inkey(50)
endif
enddo
return
function conexsql
local nvz :=0
RDDSETDEFAULT( "SQLMIX" )
do while .t.
nConnection := RDDINFO( 1001, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
IF nConnection == 0
nvz++
inkey(nvz*4.5)
if nvz>9
RDDSETDEFAULT( "DBFNTX" )
Return .f.
endif
else
@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
if nvz>1
@ maxrow()-1,1 say "Conectou"
inkey(.5)
@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
endif
exit
endif
enddo
?"Conferir número da conexão:"
?nConnection
inkey(.5)
return .t.
Estou rodando ele há quase uma hora e ainda não deu nenhum erro. Ele conectou e desconectou em todas as vezes, sem problema.
Mas, estranhamente, nesta minha outra função, que aparentemente está igual, nunca desconecta:
function atisql
local arqat
local nrvz :=0
local nrvz2 :=0
private arq :=""
private nConnection
cadativ("Atisql","Atisql: inÃcio"," ",0," ",0,0)
@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
@ maxrow()-1,1 say "Atisql: Preparando para atualizar Ãndice"
if conexsql()
?"Verificar conexão"
?nConnection
DBUSEAREA( .T.,, "SELECT atind,nrtarefa FROM tarefas WHERE atind='S'")
if !RDDINFO( 1002,,, nConnection)
?"Não desconectou; conferir nConnection:"
?nConnection
tone(261.7,33)
inkey(30)
endif
arqat=nrtarefa
do while nrvz<130
if conexsql()=.f.
?"Não conectou"
cadativ("Atisql","Atisql: não conectou2"," ",0," ",0,0,"")
inkey(5)
return .f.
endif
DBUSEAREA( .T.,, "SELECT nrtarefa FROM tarefas WHERE nrtarefa='"+arq+"'")
?"Verificar conexão"
?nConnection
if !RDDINFO( 1002,,, nConnection)
?"Não desconectou2; conferir nConnection:"
?nConnection
tone(261.7,33)
inkey(30)
endif
enddo
endif
Parece evidente que o erro está na minha função, mas não consigo descobrir qual é o erro.
Eu estava te perguntando sobre o retorno no caso do 1001 (conectar). Já percebi que ele gera números sequenciais. E também já testei que isso funciona para cada programa separado (estou rodando dois ao mesmo tempo e cada um gera uma numeração diferente).
A minha dúvida é: sempre que ela retornar, por exemplo, 10, significa que tem outras 9 conexões ativas? Ou pode ser que as conexões 1, 2, 3, 4, 5, 6, 7, 8 e 9 já não estejam mais ativas?
Salvo engano, existe um tempo limite para cada conexão, estou certo? Qual é esse tempo?