REPARAR BANCO DE DADOS - ACCESS
Vixi, nem sei porque postei aqui, que aula !!, rsrsr. Parabens Professor e Marcelo.
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.
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.
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:
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:
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.
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.
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:
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
Bom só enriquecendo um pouco mais o que o colega professor ja postou
http://www.macoratti.net/compacta.htm
http://www.macoratti.net/compacta.htm
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
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
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
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
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.
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.
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.
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.
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
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
Tópico encerrado , respostas não são mais permitidas