ADO: retorno

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

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:

ADO: retorno

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO: retorno

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

ADO: retorno

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO: retorno

Mensagem 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?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

ADO: retorno

Mensagem por cjp »

Realmente. Agora funcionou. Muito obrigado.
Inacio de Carvalho Neto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

ADO: retorno

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

ADO: retorno

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

ADO: retorno

Mensagem 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 ??
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

ADO: retorno

Mensagem 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.
   
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO: retorno

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

ADO: retorno

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO: retorno

Mensagem por JoséQuintas »

Escrevi errado
Não é oCN:Sate, e sim oCN:State.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO: retorno

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder