Disconnect não funciona no MySQL

Forum sobre SQL.

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:

Disconnect não funciona no MySQL

Mensagem por cjp »

Meus amigos,

Estou tentando fazer desconexão de um banco de dados em MySQL, mas não está funcionando.

Estou testando assim:

Código: Selecionar todos

#define RDDI_DISCONNECT   1002
RDDINFO( 1002, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
Também já tentei direto assim:

Código: Selecionar todos

RDDINFO( RDDI_DISCONNECT, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
Das duas formas só retorna falso.

Os dados do banco de dados, usuário e senha são os mesmos que eu uso para conectar. Pra conexão funciona normalmente, mas não está funcionando pra desconectar.

Tenho percebido frequentes negativas de conexão. e o provedor me informar que é por haver mais de 300 conexões ativas. Por isso eu preciso desativá-las.

Alguém me ajuda?
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:

Disconnect não funciona no MySQL

Mensagem por Toledo »

Inácio, provavelmente você deve estar fazendo a conexão da seguinte forma:

Código: Selecionar todos

nConnection := RDDINFO( RDDI_CONNECT, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
Neste caso, a desconexão seria da seguinte forma:

Código: Selecionar todos

RDDINFO(RDDI_DISCONNECT,,,nConnection)
Abraços,
Editado pela última vez por Toledo em 01 Dez 2014 13:03, em um total de 1 vez.
Razão: Esta mensagem foi editada para corrigir o comando RDDINFO(RDDI_DISCONNECT,,,nConnection), que estava errado.
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:

Disconnect não funciona no MySQL

Mensagem por cjp »

Obrigado pela resposta, Toledo.

Fiz da forma que vc recomendou, mas ainda está retornando falso.

Já até testei que nConnection está certo.

Veja, estou fazendo assim:

Código: Selecionar todos

function atisql
         local arqat
		 local nrvz :=0
		 local nrvz2 :=0
		 private arq :=""
		 @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
		 @ maxrow()-1,1 say "Atisql: Preparando para atualizar índice"
		 if conexsql()
            DBUSEAREA( .T.,, "SELECT atind,nrtarefa FROM tarefas WHERE atind='S'")
            arqat=nrtarefa
		 do while nrvz<130
	        if isdigit(substr(arqat,2,1))
               arq=substr(arqat,1,1)+alltrim(str((val(substr(arqat,2)))+1))
            else
               arq=substr(arqat,1,2)+alltrim(str((val(substr(arqat,3))+1)))
            endif
			if conexsql()=.f.
		       ?"Não conectou"
			   inkey(5)
			   return .f.
			endif
            DBUSEAREA( .T.,, "SELECT nrtarefa FROM tarefas WHERE nrtarefa='"+arq+"'")
cls			
?"Verificar o retorno da desconexão"
            ?RDDINFO(RDDI_DISCONNECT, nConnection)
?nConnection
inkey(10)
tone(261.7,33)
inkey(10)
inkey(10)
inkey(10)			
		 enddo
	     use
return
A função conexsql() está assim:

Código: Selecionar todos

function conexsql
		 local nvz :=0
         RDDSETDEFAULT( "SQLMIX" )
		 do while .t.
            nConnection := RDDINFO( 1001, { "ODBC", "Server=mysql.xxx;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xx;pwd=xxx;database=xxx;" } )
            IF nConnection == 0
			   nvz++
			   if nvz>1 .or. us="I"
			      @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
			      @ maxrow()-1,1 say "Tentando conexão com o servidor; aguarde ("+alltrim(str(nvz))+"/10)"+if(us="I","; nrtsql: "+alltrim(str(nrtsql)),"")
			   endif
			   inkey(nvz*4.5)
			   if nvz>9
                  RDDSETDEFAULT( "DBFNTX" )
				  nrtsql++
                  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
			   nrtsql=0
			   exit
			endif
		 enddo
?"Conferir número da conexão:"
?nConnection
inkey(.5)		 
return .t.
Peço-te, por favor, que me explique como funciona o retorno da RDDINFO, pois notei que ele retorna números sequenciais (1, 2, 3, 4...). Mas a minha dúvida é: quando ele retorna 2, significa que a conexão 1 ainda está ativa?

E outra dúvida é: a sequência de conexões ativas é apenas na aplicação que estou rodando, ou se refere a todas as conexões ativas do banco de dados, mesmo aquelas geradas por outros aplicativos e outros usuários?

Será que existe uma forma de derrubar todas as conexões ativas, de todos os usuários?
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:

Disconnect não funciona no MySQL

Mensagem por Toledo »

Inácio, desculpe, faltou algumas vírgulas no comando para desconectar, o correto é:

Código: Selecionar todos

RDDINFO(RDDI_DISCONNECT,,,nConnection)
cjp escreveu:como funciona o retorno da RDDINFO, pois notei que ele retorna números sequenciais (1, 2, 3, 4...)
O retorno vai depender do comando que será executado, no caso da conexão com o banco de dados, será retornado o handle da conexão (1,2,3,etc), e retorna 0 no caso de erro na conexão.
Já na desconexão, o retorno será .F. ou .T.
cjp escreveu:Será que existe uma forma de derrubar todas as conexões ativas, de todos os usuários?
Bom, acho que não, cada aplicativo manipula a sua conexão.

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:

Disconnect não funciona no MySQL

Mensagem por cjp »

Obrigado, Toledo. Mas, infelizmente, ainda não funcionou. Está retornando .F. neste comando:

Código: Selecionar todos

            if !RDDINFO( 1002,,, nConnection)
E eu estou conferindo o nConnection, está certo.

Eu fiz o seguinte programinha de teste:

Código: Selecionar todos

#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:

Código: Selecionar todos

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?
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

Disconnect não funciona no MySQL

Mensagem por Itamar M. Lins Jr. »

Não vi o comando para fechar o DBF(tabela) antes de desconectar, dbCloseAll() ou (cAlias)->(DbCloseArea())

O arquivo hbrddsql.ch

Código: Selecionar todos

/* NOTE: This file is also used by C code. */

#ifndef HB_RDDSQL_CH_
#define HB_RDDSQL_CH_

/* New ...INFO_ constants */
#define DBI_QUERY             1001

#define RDDI_CONNECT          1001
#define RDDI_DISCONNECT       1002
#define RDDI_EXECUTE          1003
#define RDDI_ERROR            1004
#define RDDI_ERRORNO          1005
#define RDDI_NEWID            1006
#define RDDI_AFFECTEDROWS     1007
#define RDDI_QUERY            1008

#endif
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:

Disconnect não funciona no MySQL

Mensagem por cjp »

Não imaginava que precisava, mas funcionou agora, obrigado.

Não entendi a referência ao arquivo hbrddsql.ch.

Eu queria entender como é gerado o nr gerado pelo RDDINFO (1001...

Antes estava gerando números sequenciais, mas voltando frequentemente ao 1. Agora, que está desconectando, ainda está gerando números sequenciais, mas não está voltando ao 1.

Também queria entender como usar o 1004 (error). Ele gera relatório de eventual erro na execução?
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:

Disconnect não funciona no MySQL

Mensagem por cjp »

Meus amigos,

Estou ainda tendo problema para desconectar em alguns casos. Eventualmente, o comando RDDINFO (1002, nConnection) está retornando .f.. Tem como saber por que isso? Testei descobrir com rddinfo(1004) e rddinfo(1005), mas a primeira está retornando em branco, e a segunda retorna zero.

Minha função está assim:

Código: Selecionar todos

function entersql
local bsusant, bsusdep
         local prfaz
         local vzab :=60
		 local cores :=setcolor()
		 local vzcon :=0
         local nConnection
		 private rc :=recno()
		 private ati
		 private pr :=0
		 private as :=""
		 private ex :="I"
		 private sol:="N"
         private te :=20
		 private inc :="Inacio"
		 private dtinc :=ctod("01/01/00")
		 private hrinc :="00:00:00"
		 private dtcg :=ctod("01/01/00")
		 private dtpref :=ctod("01/01/00")
         private vzresp2 :=0
		 private vinc :=""
		 if us="I"
		    private v1[5]
		    private v3[5]
		 else
		    private v1[3]
			private v3[3]
		 endif
		 v1[1]="substr(dtoc(Data),1,5)"
		 v1[2]="substr(Hora,1,5)"
		 if us="I"
		    v1[3]="Tempousado"
		    v1[4]="Tempocompu"
		    v1[5]="Tarefa"
			v3[3]="Tpu"
			v3[4]="Tpc"
		 else
		    v1[3]="Tarefa"
		 endif
		 v3[1]="Data"
		 v3[2]="Hora"
		 
		 do while .t.
            nConnection=conexsql()
		    if nConnection>0
		       close databases
               DBUSEAREA( .T.,, "SELECT CONVERT(hrexibe using utf8) as hrr,data,hrexibe,hora,prioridade,assunto,tarefa,exibe,soluc,incluidor,tempoestim,tempousado,tempocompu,vinculo,atind,dtcarga,dtprefer,tempocompu FROM tarefas WHERE nrtarefa='"+arq+"'", arq+"_SQL")
               pr=prioridade
               as=assunto
               ex=exibe
               sol=soluc
               prfaz=pr
		       dtinc=data
		       hrinc=hora
		       inc=incluidor
		       te=tempoestim
		       ati=atind
		       dtcg=dtcarga
		       dtpref=dtprefer
			   vinc=vinculo
			   exit
			else
			   vzcon++
			   if vzcon>10
			      mandmail1("","Não conectou no entersql")
				  return .f.
			   endif
			endif
	     enddo

        keysec(27,220,-1,.t.)
		keyb "Y"
        set color to w/r
 		cls
        set cursor on
        dbedit(7,1,maxrow()-6,maxcol()-1,v1,"responde2",,v3)
	    set color to (cores)
		cls
		use
        bError := ErrorBlock( {|e| Break(e) } )
        begin sequence
              RDDSETDEFAULT( "SQLMIX" )
              if !RDDINFO( 1002, nConnection)
	             if us="I"
	                ?"Não desconectou no entersql; conexão:"
					?nConnection
					?rddinfo(1004)
					?rddinfo(1005)
		            tone(261.7,1)
		            inkey(10)
		         endif
		      endif
        recover using e
              cMessage := ErrorMessage(e)
              logerro()
              mandmail1("error.log","Erro na função acertsql (fechamento da conexão) contornado com o recover do begin sequence")
        endsequence
        ErrorBlock( bError )
        RDDSETDEFAULT("DBFNTX")
return .t.
Alguém me ajuda?
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:

Disconnect não funciona no MySQL

Mensagem por Toledo »

Amigo, você mesmo pode se ajudar... basta ler novamente as mensagens acima, a partir da 4ª mensagem deste tópico.

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:

Disconnect não funciona no MySQL

Mensagem por cjp »

De fato faltaram as vírgulas. Bobeira minha.

Muito obrigado.
Inacio de Carvalho Neto
Responder