Página 1 de 1

ADO: retorno

Enviado: 25 Abr 2020 18:14
por cjp
Pessoal, preciso da ajuda de vocês com uma questão. Por favor, vejam este código:

Código: Selecionar todos

FUNCTION conectado(nProvedor)
         LOCAL cnConnection
         LOCAL nPort :=" "
         LOCAL nVersion :=3
         LOCAL cServer :="mysql.inaciocarvalho.com.br"
         LOCAL cDatabase :="inacio"
         LOCAL cUser :="inacio"
         LOCAL cPassword :="xxxxxxxxxx"
         private nVzexq :=0
   
   
   #define AD_USE_CLIENT                    3

   hb_Default( @nPort, 3306 )
   hb_Default( @nVersion, 3 )
   
   do while .t.
      ODBC_MARIADB=Mariadb_StringConexao()

      cnConnection:= win_OleCreateObject( "ADODB.Connection" )
      cnConnection:ConnectionString := ODBC_MARIADB + ";Server=" + cServer + ";" + "Port=" + Ltrim( Str( nPort ) ) + ;
         ";Stmt=;Database=" + cDatabase + ";User=" + cUser + ";Password=" + cPassword + ";Collation=latin1;" + ;
         "AUTO_RECONNECT=1;COMPRESSED_PROTO=0;PAD_SPACE=1" // usando compactação impede certas checagens // Option=131072;
      cnConnection:CursorLocation    := AD_USE_CLIENT
      cnConnection:CommandTimeOut    := 300 // seconds
      cnConnection:ConnectionTimeOut := 300 // seconds
	  
      if cnConnection:State#0
	     exit
	  else
	     nVzexq++
		 if nVzexq>5
		    ?"Não conectou"
			inkey(5)
			return 999
	     endif
	  endif
   enddo

RETURN cnConnection
A questão é que a cnConnection:State retorna sempre 0, conectando ou não.

Eu preciso identificar quando conectou e quando não conectou.

Alguém pode me ajudar?

ADO: retorno

Enviado: 25 Abr 2020 20:46
por JoséQuintas
Pergunta estranha pra quem já usa ADO há bastante tempo.

Conexão está aberta?
É lógico que a conexão está sempre fechada, só vai estar aberta se.... ABRIR.
Cadê o cnConexao:OPEN() ?

Código: Selecionar todos

PROCEDURE Main

   LOCAL oCN := ConexaoSQL(1)
   
   IF ! AbreConexao( oCN )
      QUIT
   ENDIF
   oCN:Close()
   
   RETURN

FUNCTION AbreConexao( oCN )

   BEGIN SEQUENCE WITH __BreakBlock()
      oCN:Open()
   ENDSEQUENCE
   
   RETURN oCN:Sate != 0
   
FUNCTION ConexaoSQL( nProvedor )
   
   LOCAL cnConnection, cServer, cDatabase, cUser, cPassword, nPort := 3306

   hb_Default( @nProvedor, 1 )

   DO CASE
   CASE nProvedor == 1
      cServer   :="mysql.inaciocarvalho.com.br"
      cDatabase :="inacio"
      cUser     :="inacio"
      cPassword :="xxxxxxxxxx"
   CASE nProvedor == 2
   ENDCASE

   cnConnection := win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString := ;
      MariaDB_StringConexao() + ";" + ;
      "Server=" + cServer + ";" + ;
      "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
      "Database=" + cDatabase + ";" + ;
      "User=" + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=latin1;" + ;
      "AUTO_RECONNECT=1;"
   cnConnection:CursorLocation    := 3 // AD_USE_CLIENT
   cnConnection:CommandTimeOut    := 300 // seconds
   cnConnection:ConnectionTimeOut := 300 // seconds
   
   RETURN cnConnection

ADO: retorno

Enviado: 26 Abr 2020 00:46
por cjp
Eu abro a conexão assim:

Código: Selecionar todos

         conexao := conectado(nProvAcoes)
		 conexao:open()
Não está certo?

O teu código está dando erro:
Ocorreu o erro: Error WINOLE/1007 Os argumentos sÒo incorretos, estÒo fora do intervalo aceitßvel ou estÒo em conflito. (0x800A0BB9): ADODB.Connection
Nesta parte:

Código: Selecionar todos

   BEGIN SEQUENCE WITH __BreakBlock()
      oCN:Open()
   ENDSEQUENCE
Testei mudar o oCN de local para private, mas continuou dando esse erro.

ADO: retorno

Enviado: 26 Abr 2020 13:40
por JoséQuintas
cjp escreveu:Eu abro a conexão assim:
1: conexao := conectado(nProvAcoes)
2: conexao:open()
Não está certo?
Não está vendo o erro?
Abre a conexão na linha 2
Como quer que a linha 1 mostre diferente de fechado?

ADO: retorno

Enviado: 26 Abr 2020 16:16
por cjp
Realmente. Agora funcionou. Muito obrigado.

ADO: retorno

Enviado: 26 Abr 2020 16:52
por asimoes
O teste é simples:

Faz um Open(), Close() e verifica o state, o close() pode acontecer indiretamente por uma falha de rede, caso contrário o state sempre irá retornar 0

ADO: retorno

Enviado: 26 Abr 2020 18:24
por cjp
Na verdade o que vi aqui é que, quando não abre, dá erro. Daí eu simplesmente tratei o erro e resolveu meu problema.

Mas acho estranho que dê erro quando não abra. Imagino que o ideal é que desse retorno diferente abrindo e não abrindo.

ADO: retorno

Enviado: 26 Abr 2020 18:40
por asimoes
cjp escreveu:Na verdade o que vi aqui é que, quando não abre, dá erro. Daí eu simplesmente tratei o erro e resolveu meu problema.

Mas acho estranho que dê erro quando não abra. Imagino que o ideal é que desse retorno diferente abrindo e não abrindo.
Tem que investigar a causa do problema, firewall, antivirus, plugin de banco ??

ADO: retorno

Enviado: 26 Abr 2020 22:37
por cjp
Não sei o que fiz de errado, mas agora não está mais funcionando em nenhuma hipótese.

Alguém pode me ajudar?

Minha função ficou assim:

Código: Selecionar todos

FUNCTION conectado(nProvedor) //( cServer, cDatabase, cUser, cPassword) , nPort, nVersion )
         LOCAL cnConnection
         LOCAL nPort :=" "
         LOCAL nVersion :=3
         LOCAL cServer :="mysql.inaciocarvalho.com.br"
         LOCAL cDatabase :="inacio"
         LOCAL cUser :="inacio"
         LOCAL cPassword :="xxxx"
         private nVzexq :=0
         do case
            case nProvedor=999
	             cServer="erro"
		         cDatabase="inacio"
		         cUser="inacio"
		         cPassword="gil"
            case nProvedor=17
	             cServer="192.99.20.181"
		         cDatabase="inacioca"
		         cUser="inacioca"
		         cPassword="xxxx"
         endcase

         do while .t.
            bError := ErrorBlock( {|e| Break(e) } )
            begin sequence
			
                  #define AD_USE_CLIENT                    3
                  hb_Default( @nPort, 3306 )
                  hb_Default( @nVersion, 3 )
   
                  ODBC_MARIADB=Mariadb_StringConexao() 

                  cnConnection:= win_OleCreateObject( "ADODB.Connection" )
                  cnConnection:ConnectionString := ODBC_MARIADB + ";Server=" + cServer + ";" + "Port=" + Ltrim( Str( nPort ) ) + ;
                  ";Stmt=;Database=" + cDatabase + ";User=" + cUser + ";Password=" + cPassword + ";Collation=latin1;" + ;
                  "AUTO_RECONNECT=1;COMPRESSED_PROTO=0;PAD_SPACE=1" // usando compactação impede certas checagens // Option=131072;
                  cnConnection:CursorLocation    := AD_USE_CLIENT
                  cnConnection:CommandTimeOut    := 300 // seconds
                  cnConnection:ConnectionTimeOut := 300 // seconds
	  
            	  cnConnection:open()

            recover using e
		            nVzexq++
					if nVzexq>3
		               @ 20,5 say "Não está conseguindo executar a conexão"
					endif
		            if nVzexq>5
                       RDDSETDEFAULT("DBFNTX")
	                   cMessage := ErrorMessage(e)
				       if at("Lost connection",cMessage)=0 .and. at("Unable to get error",cMessage)=0 .and. val(substr(time(),5,1))<3
	                      logerro()
                          mandmail1("error.log","Erro no conectado contornado com o recover do begin sequence")
				       endif
			           inkey(3)
			           return .f.
		            endif
		            loop
            endsequence
            ErrorBlock( bError )
			
			exit
			
         enddo

RETURN .t.
   

ADO: retorno

Enviado: 27 Abr 2020 12:07
por JoséQuintas
É que na prática está complicando cada vez mais.
Faça como mostrei: divida em duas partes uma pra criar a conexão e outra pra abrir.

Se não sabe tratar erro com BEGIN SEQUENCE, então não use.
Retire e vai descobrir quais são os erros.

Aonde pode acontecer erro? no Open() ?
Então....

BEGIN SEQUENCE ...
conexão:Open()
ENDSEQUENCE

É somente nesse comando que precisa verificar erro, e não no fonte inteiro.
Ao colocar no fonte inteiro... escondeu todo tipo de erro, até erro no fonte.

ADO: retorno

Enviado: 27 Abr 2020 13:41
por cjp
Eu realmente sou uma topeira e não consigo entender isso.
No meu exemplo, agora, não está dando mais erro no Open(), mas apenas no retorno dessa função.
Mas esqueça o meu, vamos tentar no seu modelo.

Fiz assim:

Código: Selecionar todos

PROCEDURE Main

   LOCAL oCN := ConexaoSQL(1)

   IF ! AbreConexao( oCN )
?"Não conectou"
inkey(11)   
      QUIT
   ENDIF
?"Conectou"
inkey(11)   
   oCN:Close()
   
RETURN

FUNCTION AbreConexao( oCN )

   BEGIN SEQUENCE WITH __BreakBlock()
      oCN:Open()
   ENDSEQUENCE
   
RETURN oCN:Sate != 0
   
FUNCTION ConexaoSQL( nProvedor )
   
   LOCAL cnConnection, cServer, cDatabase, cUser, cPassword, nPort := 3306

   hb_Default( @nProvedor, 1 )

   DO CASE
   CASE nProvedor == 1
      cServer   :="mysql.inaciocarvalho.com.br"
      cDatabase :="inacio"
      cUser     :="inacio"
      cPassword :="xxxxxx"
   CASE nProvedor == 2
   ENDCASE

   cnConnection := win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString := ;
      MariaDB_StringConexao() + ";" + ;
      "Server=" + cServer + ";" + ;
      "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
      "Database=" + cDatabase + ";" + ;
      "User=" + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=latin1;" + ;
      "AUTO_RECONNECT=1;"
   cnConnection:CursorLocation    := 3 // AD_USE_CLIENT
   cnConnection:CommandTimeOut    := 300 // seconds
   cnConnection:ConnectionTimeOut := 300 // seconds
   
RETURN cnConnection

FUNCTION Mariadb_StringConexao()
         LOCAL cTxt := ""
         local us :="I"
         local nvzexq :=0

         if ((us="M" .or. us="U" .or. us="K" .or. us="S" .or. us="I" .or. us="E" .or. us="Z" .or. us="G" .or. GetEnv(  "COMPUTERNAME" ) == "MPPRNB-Q82V8ASU" .or. GetEnv( "COMPUTERNAME" ) == "DESKTOP-IT12ARQ") .and. nVzexq<4) .or.;
            (us#"M" .and. us#"K" .and. us#"U" .and. us#"S" .and. us#"I" .and. us#"E" .and. us#"Z" .and. us#"G" .and. GetEnv(  "COMPUTERNAME" ) # "MPPRNB-Q82V8ASU" .and. GetEnv( "COMPUTERNAME" ) # "DESKTOP-IT12ARQ" .and. nVzexq>3)
            cTxt += "Driver={MariaDB ODBC 3.1 Driver}"
	     ELSE
            cTxt += "Driver={MySQL ODBC 3.51 Driver}"
         ENDIF
		 
RETURN cTxt
  
Está dando o seguinte erro:
Error WINOLE/1007 Os argumentos sπo incorretos, estπo fora do intervalo aceitßvel ou estπo em conflito. (0x800A0BB9): ADODB.Connection (DOS Error -2147352567)
Na seguinte linha:
RETURN oCN:Sate != 0
Em suma, parece que o problema é o mesmo que estou tendo na minha função: o retorno.

ADO: retorno

Enviado: 27 Abr 2020 14:34
por JoséQuintas
Escrevi errado
Não é oCN:Sate, e sim oCN:State.

ADO: retorno

Enviado: 27 Abr 2020 14:58
por JoséQuintas
A parte da string está esquisita, mas dá pra simplificar.
Basicamente criar as listas, e verificar se está nas listas.
Talvez ajude a decidir se realmente era pra ser assim.

Código: Selecionar todos

FUNCTION Mariadb_StringConexao()
   
   LOCAL aUsList   := { "M", "U", "K", "S", "I", "E", "Z", "G" }
   LOCAL aDeskList := { "MPPRNB-Q82V8ASU", "DESKTOP-IT12ARQ" }
   LOCAL cThisDesk := GetEnv( "COMPUTERNAME" )
   LOCAL us        := "I"
   LOCAL nvzexq    := 0
   LOCAL lConhecido, cTxt
   
   lConhecido := ASCan( aUsList, { | e | e == US } ) != 0 .OR. ASCan( aDeskList, { | e | e == cThisDesk ) != 0
   IF ( nvzexq < 4 .AND. lConhecido ) .OR. ;
      ( nvzexq > 3 .AND. .NOT. lConhecido )
      cTxt := "Driver={MariaDB ODBC 3.1 Driver}"
   ELSE
      cTxt := "Driver={MySQL ODBC 3.51 Driver}"
   ENDIF
       
   RETURN cTxt