REPARAR BANCO DE DADOS - ACCESS

NILSONTRES 27/11/2014 15:24:50
#442833
Vixi, nem sei porque postei aqui, que aula !!, rsrsr. Parabens Professor e Marcelo.

HUBER 28/11/2014 08:04:59
#442844
Alguma ajuda sobre o meu tópico postado anteriormente conforme abaixo:

Meu problema está 90% em queda de energia sim, concordo também que a melhor solução é sim passar para MySQL, só que isso leva um tempo, e de imediato procuro uma solução. Sei também que a maneira mais fácil é abrir o banco pelo próprio ACCESS que o mesmo já repara, isso para mim é fácil, difícil é ter que ficar acessando clientes ou explicando para usuários como fazer isso, até porque tenho vários clientes 24 horas.

PROFESSOR

DAO:
RepairDatabase [Ô]C:\banco.mdb[Ô]
CompactDatabase [Ô]C:\banco.mdb[Ô], App.Path & [Ô]\copia.mdb[Ô]

Neste, qual é a referência necessária para que eu possa estar testando pois dá função RepairDatabase não definida

ADO: Neste caso, você precisa referenciar a Jet and Replication Objects
Dim JRO As New JRO.JetEngine
JRO.CompactDatabase [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\banco.mdb[Ô], [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\copia.mdb;Jet OLEDB:Engine Type=4[Ô]

Neste o mesmo dá que Formato do Banco de Dados inválido.
PROFESSOR 28/11/2014 14:46:39
#442852
Sem problemas.

Para uma base de dados Microsoft Access, os dois processos (reparar e compactar) podem ser realizados por meio da DAO (Microsoft Data Access Objects Library), da JRO (Microsoft Jet And Replication Objects Library) ou ainda por meio da Microsoft Access ActiveX Object Library.

Independente de quais métodos / bibliotecas você utilize, essa base de dados não poderá estar conectada, e nem pode ser conectada em modo compartilhado para efetuar essas operações.

Usando a DAO até a versão 3.5.1, o processo para reparar uma base de dados é feito sempre por dois métodos chamados consecutivamente, que são o RepairDatabase e o CompactDatabase. Após a versão 3.5.1, não existe mais o método RepairDatabase. Mas a biblioteca não perdeu funcionalidade: O método CompactDatabase assume ambas as funcionalidades, o que significa que para reparar uma base MS-Access, é necessário gerar uma cópia da mesma, á partir dessa versão.

Com isso em mente, e lendo o que você postou, acredito que esteja usando a DAO 3.6.

Se você não estiver usando uma versão de banco de dados criada em mecanismo de versão diferente dessa 3.6 (Jet OleDb 4.0, MS-Access 2000/2002) e ainda, se não estiver usando senhas de arquivo, a função á seguir tenta efetuar o processo, veja:

[ô]A função recebe como parâmetro o caminho+nome do arquivo de dados.
Public Function DbCompact(ByVal banco As String) As String
On Error GoTo hell: [ô]Se ocorrer algum erro, tratar.
MousePointer = vbHourGlass
Dim ret As String
Dim tmpDb As String
tmpDb = banco & [Ô].temp[Ô] [ô]Nome do arquivo temporário
[ô]Se o arquivo temporário existir, vamos [Ô]matar[Ô] antes de prosseguir.
If Len(Dir(tmpDb)) > 0 Then
Kill tmpDb
End If
[ô]Vamos usar uma instância do DbEngine da DAO:
Dim db As New DAO.DBEngine
[ô]Agora vamos tentar compactar:
db.CompactDatabase banco, tmpDb
[ô]Se chegou aqui, resta substituir o original pelo reparado/compactado:
Kill banco
Name tmpDb As banco
[ô]Acabou sem problemas.
GoTo sai:
hell:
[ô]Ocorreu um problema. Vamos retornar qual foi.
ret = err.Description
err.Clear
sai:
On Error GoTo 0
MousePointer = vbDefault
DbCompact = ret
End Sub


No exemplo acima eu não especifiquei detalhes, por se tratar apenas de um exemplo básico, mas a sintaxe global do método é a seguinte:

CompactDatabase([origem], [destino], [linguagem], [opções/versão], [senha])


Assim, é possivel utilizar ainda essas várias opções para efetuar a tarefa. Portanto, adaptando a função do exemplo, ela poderá permitir manipular arquivos com senha de proteção, e/ou em versões de mecanismo diferentes e/ou com uma [Ô]linguagem[Ô] (locale) distinta.

Observe que, mesmo que seja bastante raro, infelizmente ocorre de o arquivo não poder mais ser recuperado, mesmo pelo MS-Access. Isso não decorre de efetuar operações de reparo / compactação com freqüência, como alguém possa pensar, mas sim de uma falha de I/O, seja do sistema operacional, da mídia ou ainda, da rede. Dessa forma, efetuar backups regulares é sempre bem vindo.
MARIOANDRADE 28/11/2014 23:32:56
#442854
Gente, aproveitando aí alguém pode dizer qual é a referencia para
JRO.JetEngine
Outra coisa, eu como faço para compactar um banco de dados com senha, minha conexão é assim:
Public db As New ADODB.Connection
Public rs As New ADODB.Recordset
Public path As String
Public Sub ConnectDB()
path = App.path & [Ô]\BDA.mdb[Ô]
db.Open [Ô]Provider=microsoft.jet.oledb.4.0;data source=[Ô] & path & [Ô];jet oledb:database Password=123456;[Ô]
End Sub

MARCELO.TREZE 29/11/2014 06:49:56
#442855
Bom só enriquecendo um pouco mais o que o colega professor ja postou

http://www.macoratti.net/compacta.htm
NILSONTRES 29/11/2014 15:06:10
#442857
MAR10;
COMPACTAR BANCO:

Public Function compactaDB(ByVal origem_path As String, _
ByVal destino_path As String) As Boolean
On Error GoTo Erro_compacta
Dim DB_origem As String, DB_destino As String
Dim JRO As JRO.JetEngine
Set JRO = New JRO.JetEngine
DoEvents
DB_origem = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & origem_path & [Ô];Jet OLEDB:Database Password=290901;[Ô]
DB_destino = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & destino_path & [Ô] ;Jet OLEDB:Database Password=290901;Engine Type=5[Ô]
JRO.CompactDatabase DB_origem, DB_destino
compactaDB = True
Exit Function
Erro_compacta:
compactaDB = False
MsgBox Err.Description, vbExclamation
End Function

[ô]CHAMANDO A FUNÇÃO:
If MsgBox([Ô]Confirma Compactar e Reparar Banco de Dados ?[Ô], vbQuestion + vbYesNo, [Ô]Confirmação[Ô]) = vbYes Then
Conexao.Close
DoEvents
Me.MousePointer = 13
Me.Enabled = False
Dim origem_path, destino_path As String
origem_path = Banco [ô]Caminho Banco Original
destino_path = Banco2 [ô]Caminho Banco Compactado, TEMPORARIO

If Not compactaDB(origem_path, destino_path) Then [ô] Se algum erro acontecer
ConectaBanco
MsgBox [Ô]Ocorreu um erro durante a compactacao [Ô] & vbCrLf & vbCrLf & Loc2, vbExclamation
DoEvents
Me.MousePointer = 0
Me.Enabled = True
Else
Kill origem_path [ô]Exclui Banco se Compactação
Name destino_path As origem_path [ô]Renomeia o Banco Compactado
Me.Enabled = True
Me.MousePointer = 0
MsgBox [Ô]Compactado com Sucesso[Ô], vbInformation, [Ô]Aviso[Ô]
ConectaBanco
End If
End If
HUBER 01/12/2014 08:35:51
#442875
Olá PROFESSOR

Aparentemente sua função dará certo, testei em 2 banco de dados que tinha aqui que separei para teste e nas duas funcionou. Agora só melhorar a função. Aproveitando as aulas, tem alguma função que possa estar colocando progressbar na reparação do banco.

grato
HUBER 02/12/2014 09:17:52
#442913
Olá

Tem como usar o ProgressBar quando estiver passando a Reparação do Banco de Dados, para poder mostrar para o usuário o andamento do mesmo.
PROFESSOR 02/12/2014 13:57:47
#442929
Hehehe! Ficou legal esse tópico: O pessoal está [Ô]tirando as teias de aranha[Ô] dos códigos e matando saudades!

Só lembrando que o processo em sí não têm nada á ver com formulário ou com interface de usuário, ou seja, ainda que eu tenha inserido um [Ô]MousePointer[Ô] no exemplo, a compactação/reparo são processos, ok?

Os métodos ctados, tando ADO quanto DAO, são executados na mesma tarefa, em seqüência, e não possuem um retorno útil para a apresentação de status do andamento. Dessa forma, não será lá muito viável mostrar um percentual de progresso efetivo.

Ao invés disso, você pode tentar mostrar algo [Ô]animado[Ô] ao usuário final, como um arquivo de midia (gif, avi etc.), enquanto o processo não se encerra, usando o DoEvents e um loop (no caso, um Until ou um While), como se fazia mais frequentemente na época do VB6.

Acrescentando, antes de ser linchado , possível é, mas você precisaria criar algumas classes para manter ao menos uma instância da base de dados com algumas de suas propriedades (tamanho, quantidade de tabelas, quantidade de indices e outras) e ainda variáveis para o acompanhamento de seus processos, compilando essas classes como uma DLL e depois refereciando essa DLL gerada ao seu projeto. Ainda assim, o resutado final não apresentaria os valores reais, mas sim algo aproximado. Na minha opinião pessoal, muito trabalho para criar, uma preocupação adicional para manter e tudo para pouco resultado, se comparar com a opção anterior, de mostrar um arquivo de midia.
HUBER 02/12/2014 17:36:39
#442939
Olá PROFESSOR

Estou aqui a testar sua grande dica, que é usar GIF.

Estou trabalhando com uma imagem que se movimenta pelo timer e o comando FileCopy para fazer uma cópia do banco de dados, mais o gif fica congelada. segue abaixo parte do fonte

[ô]gif
img1 = App.Path & [Ô]\copia.gif[Ô]
If LoadGif(img1, Image1) Then
FrameCount = 0
Timer1.Interval = CLng(Image1(0).Tag)
Image1(0).Visible = True
Timer1.Enabled = True
End If

lblstatus.Visible = True: lblstatus.Caption = [Ô]aguarde, realizando backup...[Ô]
lblstatus.Refresh

Source = NomBco
Dest = DirBco & [Ô]\BACKUP_REPARA\[Ô] & [Ô]BACKUP[Ô] & [Ô]_[Ô] & Format(Date, [Ô]DDMMYYY[Ô]) & [Ô]_[Ô] & Format(Time, [Ô]HHMMSS[Ô]) & [Ô].MDB[Ô]

FileCopy Source, Dest
Página 2 de 3 [23 registro(s)]
Tópico encerrado , respostas não são mais permitidas