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