Clipper On Line • Ver Tópico - Disconnect não funciona no MySQL

Disconnect não funciona no MySQL

Discussão sobre SQL

Moderador: Moderadores

 

Disconnect não funciona no MySQL

Mensagempor cjp » 29 Nov 2014 17:56

Meus amigos,

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

Estou testando assim:

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

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

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

Disconnect não funciona no MySQL

Mensagempor Toledo » 01 Dez 2014 09:42

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

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:

RDDINFO(RDDI_DISCONNECT,,,nConnection)


Abraços,
Nota de Moderação:
Toledo: 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
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

Disconnect não funciona no MySQL

Mensagempor cjp » 01 Dez 2014 10:57

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:

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:

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

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

Disconnect não funciona no MySQL

Mensagempor Toledo » 01 Dez 2014 12:01

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

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

Disconnect não funciona no MySQL

Mensagempor cjp » 01 Dez 2014 15:35

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?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

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

Disconnect não funciona no MySQL

Mensagempor Itamar M. Lins Jr. » 01 Dez 2014 16:26

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

O arquivo hbrddsql.ch
/* 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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Disconnect não funciona no MySQL

Mensagempor cjp » 02 Dez 2014 02:21

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: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Disconnect não funciona no MySQL

Mensagempor cjp » 18 Dez 2014 15:35

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:

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

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

Disconnect não funciona no MySQL

Mensagempor Toledo » 18 Dez 2014 17:06

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

Disconnect não funciona no MySQL

Mensagempor cjp » 18 Dez 2014 19:11

De fato faltaram as vírgulas. Bobeira minha.

Muito obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

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




Retornar para SQL

Quem está online

Usuários vendo este fórum: Google [Bot] e 6 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