TRATAR ERROS DE ACESSO A DADOS CLIENTES X SERVIDOR
Ola Pessoal, estou tentando monta uma rotina para rede, onde o micro cliente acessa a base de dados no servidor, porem quando por qualquer eventualidade o servidor for desligado, o sistema no micro cliente deve continuar funcionando, com uma função que ficará verificando se o servidor foi reativado, se afirmativo, ela deve reabrir a base de dados e efetuar as atualizaçõs na base de dados.
Parece simples mas ja estou a dois dias fazendo teste e não consegui acertar,
1º Conecta ao servidor normalmente, Ok
2º Se o servidor esta desconectado, (Desconsiderar as funçõa de banco de dados com os erros tratados)
3º Verificar se o servidor foi reativado, se sim, reabrir as bases e efetuar as atualizações.
para ser mais preciso, eu não estou conseguindo reabir a base de dados, para continuar as atualizações do sistema.
Espero que o que estou tentando fazer tenha lógica p/ vsc entenderem.
Jair Lopes
jl.sma@ig.com.br
Parece simples mas ja estou a dois dias fazendo teste e não consegui acertar,
1º Conecta ao servidor normalmente, Ok
2º Se o servidor esta desconectado, (Desconsiderar as funçõa de banco de dados com os erros tratados)
3º Verificar se o servidor foi reativado, se sim, reabrir as bases e efetuar as atualizações.
para ser mais preciso, eu não estou conseguindo reabir a base de dados, para continuar as atualizações do sistema.
Espero que o que estou tentando fazer tenha lógica p/ vsc entenderem.
Jair Lopes
jl.sma@ig.com.br
Se é pra tentar alternativas, aà vai mais uma: conexão assÃncrona.
A conexão assÃncrona é bem usada pelo pessoal que conecta servidor via internet. Ela fica em estado de espera, e dispara os eventos (edição dos dados) apenas quando a conexão se estabelece. Dessa maneira, o aplicativo no usuário não fica "travado" à  espera de conexão. O cabra continua trabalhando sem problemas (digitando um novo cadastro, tomando cafezinho, etc; pois não dá pra acessar o banco, lembra?). Se, por exemplo, o usuário quer carregar um grid e o servidor está desligado. uma mensagem pode aparecer no cantinho, explicando que não há conexão, e que o grid será visualizado assim que os problemas acabarem.
Ei-la (a conexão assÃncrona):
Na área de declarações do form:
Private WithEvents cnm As ADODB.Connection
O WithEvents indica que a variável será preenchida somente após o disparo do evento escolhido (no nosso caso, quando a conexão for completada)
Estabelecendo uma conexão assÃncrona ao clicar no botão:
Private Sub Command1_Click()
Set cnm = New ADODB.Connection
cnm.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & app.path & "\BancoDeDadosAccess.MDB;Persist Security Info=False"
cnm.Open , , , adAsyncConnect
End Sub
Como a variável cnm depende de um evento, aà vem ele:
Private Sub cnm_connectcomplete(ByVal perror As ADODB.Error, adstatus As ADODB.EventStatusEnum, ByVal pconnection As ADODB.Connection)
MsgBox "Conexão assÃncrona completada!"
'E tome código!!! Abre o Recordset!!! Dá-lhe Update!!!
cnm.Close
End Sub
Testando: com o BD em outra máquina, acesse-o pela rede. A mensagem de conexão completada deverá aparecer imediatamente. Agora, solte o cabo azul (ou cinza) e tente novamente. Aguarde um pouco e recoloque o RJ no lugar. A mensagem (se tudo correr bem) aparecerá.
A conexão assÃncrona é bem usada pelo pessoal que conecta servidor via internet. Ela fica em estado de espera, e dispara os eventos (edição dos dados) apenas quando a conexão se estabelece. Dessa maneira, o aplicativo no usuário não fica "travado" à  espera de conexão. O cabra continua trabalhando sem problemas (digitando um novo cadastro, tomando cafezinho, etc; pois não dá pra acessar o banco, lembra?). Se, por exemplo, o usuário quer carregar um grid e o servidor está desligado. uma mensagem pode aparecer no cantinho, explicando que não há conexão, e que o grid será visualizado assim que os problemas acabarem.
Ei-la (a conexão assÃncrona):
Na área de declarações do form:
Private WithEvents cnm As ADODB.Connection
O WithEvents indica que a variável será preenchida somente após o disparo do evento escolhido (no nosso caso, quando a conexão for completada)
Estabelecendo uma conexão assÃncrona ao clicar no botão:
Private Sub Command1_Click()
Set cnm = New ADODB.Connection
cnm.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & app.path & "\BancoDeDadosAccess.MDB;Persist Security Info=False"
cnm.Open , , , adAsyncConnect
End Sub
Como a variável cnm depende de um evento, aà vem ele:
Private Sub cnm_connectcomplete(ByVal perror As ADODB.Error, adstatus As ADODB.EventStatusEnum, ByVal pconnection As ADODB.Connection)
MsgBox "Conexão assÃncrona completada!"
'E tome código!!! Abre o Recordset!!! Dá-lhe Update!!!
cnm.Close
End Sub
Testando: com o BD em outra máquina, acesse-o pela rede. A mensagem de conexão completada deverá aparecer imediatamente. Agora, solte o cabo azul (ou cinza) e tente novamente. Aguarde um pouco e recoloque o RJ no lugar. A mensagem (se tudo correr bem) aparecerá.
Bom. Sendo cnm uma legÃtima ADODB.Connection, então ela TEM que funcionar.
Então vamos sofisticar, colocando uma rotina de erro (ou melhor, uma rotina de acerto - olha essa, gente: criei uma rotina de tratamento de acertos!!!)
Dim rst As ADODB.Recordset
Private WithEvents cnm As ADODB.Connection
Private Sub Command1_Click()
Set cnm = New ADODB.Connection
cnm.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\BancoDeDadosAccess.MDB;Persist Security Info=False"
cnm.Open , , , adAsyncConnect
End Sub
Private Sub cnm_connectcomplete(ByVal perror As ADODB.Error, adstatus As ADODB.EventStatusEnum, ByVal pconnection As ADODB.Connection)
On Error GoTo conectou
MsgBox perror
Exit Sub
conectou:
MsgBox "Conexão assÃncrona completada!"
Set rst = New ADODB.Recordset
rst.Open "select * from Tabela1", cnm, adOpenForwardOnly, adLockOptimistic 'ou adLockReadOnly se não pretender modificar o RS
'Aqui uma solução para contar o recordset
If rst.EOF = False Then
rst.MoveFirst
conta = 0
Do While Not rst.EOF
conta = conta + 1
rst.MoveNext
Loop
MsgBox "Essa tabela contém " & conta & " registros."
Else
MsgBox "Não há registros nessa tabela"
End If
rst.Close
'Aqui, uma solução que passa a manipulação do recordset para a máquina do cliente
'Use com cuidado. No meu caso, o tempo de resposta para esse segundo caso aumentou pra caraca
rst.CursorLocation = adUseClient
rst.Open "select * from Tabela1", cnm, adOpenForwardOnly, adLockOptimistic 'ou adLockReadOnly se não pretender modificar o RS
MsgBox "Essa tabela contém " & rst.RecordCount & " registros."
cnm.Close
End Sub
Então vamos sofisticar, colocando uma rotina de erro (ou melhor, uma rotina de acerto - olha essa, gente: criei uma rotina de tratamento de acertos!!!)
Dim rst As ADODB.Recordset
Private WithEvents cnm As ADODB.Connection
Private Sub Command1_Click()
Set cnm = New ADODB.Connection
cnm.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\BancoDeDadosAccess.MDB;Persist Security Info=False"
cnm.Open , , , adAsyncConnect
End Sub
Private Sub cnm_connectcomplete(ByVal perror As ADODB.Error, adstatus As ADODB.EventStatusEnum, ByVal pconnection As ADODB.Connection)
On Error GoTo conectou
MsgBox perror
Exit Sub
conectou:
MsgBox "Conexão assÃncrona completada!"
Set rst = New ADODB.Recordset
rst.Open "select * from Tabela1", cnm, adOpenForwardOnly, adLockOptimistic 'ou adLockReadOnly se não pretender modificar o RS
'Aqui uma solução para contar o recordset
If rst.EOF = False Then
rst.MoveFirst
conta = 0
Do While Not rst.EOF
conta = conta + 1
rst.MoveNext
Loop
MsgBox "Essa tabela contém " & conta & " registros."
Else
MsgBox "Não há registros nessa tabela"
End If
rst.Close
'Aqui, uma solução que passa a manipulação do recordset para a máquina do cliente
'Use com cuidado. No meu caso, o tempo de resposta para esse segundo caso aumentou pra caraca
rst.CursorLocation = adUseClient
rst.Open "select * from Tabela1", cnm, adOpenForwardOnly, adLockOptimistic 'ou adLockReadOnly se não pretender modificar o RS
MsgBox "Essa tabela contém " & rst.RecordCount & " registros."
cnm.Close
End Sub
é isso aÃ. Essa conexão só difere da "normal" por causa do evento que a dispara. O resto é igualzinha.
Tópico encerrado , respostas não são mais permitidas