TRATAR ERROS DE ACESSO A DADOS CLIENTES X SERVIDOR

USUARIO.EXCLUIDOS 03/06/2004 15:02:19
#27989
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
USUARIO.EXCLUIDOS 03/06/2004 17:14:33
#28035
Resposta escolhida
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á.
USUARIO.EXCLUIDOS 07/06/2004 11:03:42
#28477
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

USUARIO.EXCLUIDOS 07/06/2004 17:20:37
#28599
é 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