GARANTIR DESCONTO

Fórum Compactar e Corrigir DB no Access #204590

06/01/2004

0

Ola a todos, eu tenho uma aplicacao que trabalha com o access 97 e tenho um problema eu preciso de tempos em tempo Compactar e Corrigir o banco de dados, alguem saberia se isto é possivel fazer da minha aplicacao com comandos SQL ou de outra forma desde que nao seja pelo aplicativo do proprio access pois o usuario nao deve ter acesso a abrir o banco e fazer esta tarefa, agradeco a ajuda de todos.

Cheuk


Icheuk

Icheuk

Responder

Posts

06/01/2004

Erucci

Caro Amigo

Eu utilizo essa função para Reparar e Compactar um banco de dados Access usando ADO. Se servir....


procedure RepararCompactar;
var
ArquivoMDB: string;
DB: OLEVariant;
Temp: string;
begin
Screen.Cursor := crHourGlass;
try
ArquivoMDB := copy(DataModule.adoconnection1.ConnectionString,
pos(´Data Source=´, DataModule.adoconnection1.ConnectionString)+12,
length(DataModule.adoconnection1.ConnectionString)-(pos(´Data Source=´, DataModule.adoconnection1.ConnectionString)+12));
ArquivoMDB := copy(ArquivoMDB, 1, pos(´;´,ArquivoMDB)-1);
try
// cria o objeto para manipulacao do BD
DataModule.ADOConnection1.Close;
DataModule.ADOConnection1.Connected := False;

DB := CreateOLEObject(´DAO.DBEngine.35´);
// reparar
DB.RepairDataBase(ArquivoMDB);
// compactar
Temp := ExtractFilePath(ArquivoMDB) + ´Temp.mdb´;
DB.CompactDataBase(ArquivoMDB, Temp);
DeleteFile(ArquivoMDB);
RenameFile(Temp, ArquivoMDB);

Application.MessageBox(´Banco de dados reparado e compactado com sucesso.´, ´Aviso´, mb_IconInformation);
except
on E: Exception do Application.MessageBox(PChar(E.message), ´Erro DAO´, mb_IconError);
end;
finally
DataModule.ADOConnection1.Open;
DataModule.ADOConnection1.Connected := True;
Screen.Cursor := crDefault;
end;
end;


Responder

Gostei + 0

06/01/2004

Icheuk

Agradeço a ajuda, vou testar e depois lhe digo.

Obrigado.


Responder

Gostei + 0

08/01/2004

Ilanocf

Olá erucci,

Copiei sua função e colei em meu sistema, logo abaixo de [b:3698ddd7a6][color=red:3698ddd7a6]{$R *.DFM}[/color:3698ddd7a6][/b:3698ddd7a6], alterando apenas o nome [b:3698ddd7a6]DataModule.adoconnection1[/b:3698ddd7a6] para [b:3698ddd7a6][color=blue:3698ddd7a6]DMDados.CONEXAO[/color:3698ddd7a6][/b:3698ddd7a6]

procedure RepararCompactar; var ArquivoMDB: string; DB: OLEVariant; Temp: string; begin Screen.Cursor := crHourGlass; try ArquivoMDB := copy(DataModule.adoconnection1.ConnectionString, pos(´Data Source=´, DataModule.adoconnection1.ConnectionString)+12, length(DataModule.adoconnection1.ConnectionString)-(pos(´Data Source=´, DataModule.adoconnection1.ConnectionString)+12)); ArquivoMDB := copy(ArquivoMDB, 1, pos(´;´,ArquivoMDB)-1); try // cria o objeto para manipulacao do BD DataModule.ADOConnection1.Close; DataModule.ADOConnection1.Connected := False; DB := CreateOLEObject(´DAO.DBEngine.35´); // reparar DB.RepairDataBase(ArquivoMDB); // compactar Temp := ExtractFilePath(ArquivoMDB) + ´Temp.mdb´; DB.CompactDataBase(ArquivoMDB, Temp); DeleteFile(ArquivoMDB); RenameFile(Temp, ArquivoMDB); Application.MessageBox(´Banco de dados reparado e compactado com sucesso.´, ´Aviso´, mb_IconInformation); except on E: Exception do Application.MessageBox(PChar(E.message), ´Erro DAO´, mb_IconError); end; finally DataModule.ADOConnection1.Open; DataModule.ADOConnection1.Connected := True; Screen.Cursor := crDefault; end; end;


No evento OnClick do botão Compactar coloquei:

Mas ao clicar neste, deu a seguinte mensagem: [b:3698ddd7a6][color=red:3698ddd7a6]Project Oficios.exe raised exception class EOleException with message ´Não foi possível encontrar o arquivo DASQL.1´´[/color:3698ddd7a6][/b:3698ddd7a6]

Em seguida destaca a linha: [b:3698ddd7a6][color=blue:3698ddd7a6]DB.RepairDataBase(ArquivoMDB);[/color:3698ddd7a6][/b:3698ddd7a6]

Vc saberia me dizer o q fiz de errado?

Grato,

Ilano



Responder

Gostei + 0

08/01/2004

Erucci

Ilano

Acho que não está pegando o caminho correto do arquivo .mdb
Essa função pega o endereço do arquivo .MDB (Ex: c:\dados\dados.mdb) no ADOConnection.ConnectionString e guarda na string ArquivoMDB
depois faz a compactação
Faça um teste, coloque na função antes do //reparar,

ShowMessage(ArquivoMDB);

Se der a mensagem do caminho do arquivo .mdb incorreto..... então tente arrumar nessa parte

ArquivoMDB := copy(DataModule.adoconnection1.ConnectionString,
pos(´Data Source=´, DataModule.adoconnection1.ConnectionString)+12,
length(DataModule.adoconnection1.ConnectionString)-(pos(´Data Source=´, DataModule.adoconnection1.ConnectionString)+12));
ArquivoMDB := copy(ArquivoMDB, 1, pos(´;´,ArquivoMDB)-1);

[]´s

Luís Erucci


Responder

Gostei + 0

10/04/2004

Richard Lima

sei que este é um topico antigo mas vamo lá..

eu fui testar esta funcao e recebi uma mensagem do DAO dizendo ´A classe não está licenciada para uso´.. alguém sabe como resolver?


Responder

Gostei + 0

10/04/2004

Spooner

Ola,

Peguei essa funçãoo que o erucci compartilhou, fui testar e deu erro na linha

DB := CreateOleObject(´DAO.DBEngine.35´);

esta dizento que ´Sequencia de Classe Invalida´
alguem sabe resolver esse problema?


Responder

Gostei + 0

10/04/2004

Adilsond

sei que este é um topico antigo mas vamo lá.. eu fui testar esta funcao e recebi uma mensagem do DAO dizendo ´A classe não está licenciada para uso´.. alguém sabe como resolver?


Voce deve adicionar a seguinte linha no registro do windows:

[HKEY_CLASSES_ROOT\Licenses\F4FC596D-DFFE-11CF-9551-00AA00A3DC45]
@=´mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak´


Responder

Gostei + 0

11/04/2004

Richard Lima

[quote:2efd8a4205=´offender´]sei que este é um topico antigo mas vamo lá.. eu fui testar esta funcao e recebi uma mensagem do DAO dizendo ´A classe não está licenciada para uso´.. alguém sabe como resolver?


Voce deve adicionar a seguinte linha no registro do windows:

[HKEY_CLASSES_ROOT\Licenses\F4FC596D-DFFE-11CF-9551-00AA00A3DC45]
@=´mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak´[/quote:2efd8a4205]

ok passou.. mas agora deu ´OPERACAO NAO SUPORTADA PARA ESTE TIPO DE OBJETO´ na linha DB.RepairDataBase(ArquivoMDB).. e o caminho para o arquivo tah certinho..

abraço..


Responder

Gostei + 0

12/04/2004

Nerdex

Nada disso pessoal !!! que absurdo !!! Vcs... com o projeto aberto no Delphi façam o seguinte:
vá em Projet / Import Type Library e escolham a opção Microsoft Jet and Replication Objects 2.6 Library... Instale estas esta bibliotece de componentes Activex. Na paleta Activex vcs verão 2 novos componentes:

//Cam é uma string que contém o caminho da minha aplicação.
//CadC.mdb = arquivo original
//C.mdb = arquivo compactado

var Prov: widestring;
begin
Form1.Conect.Connected:=false;
Prov:=´Provider=Microsoft.Jet.OLEDB.4.0;Data Source=´;
Form1.JE.CompactDatabase(Prov+Cam+´CadC.mdb´,Prov+Cam+´C.mdb´);
DeleteFile(Cam+´CadC.mdb´);
RenameFile(Cam+´C.mdb´,Cam+´CadC.mdb´);

OBS: para funcionar vcs devem ter os componente DtSets em Active False e usei DeleteFile / RenameFile, pois ele primeiramente cria um novo arquivo de banco de dados compactado, que não posso pôr o mesmo nome do antigo (ñ aceita rewrite...), então deleto o antigo e renomeio o novo com o nome original...

Abraço


Responder

Gostei + 0

12/04/2004

Richard Lima

Nada disso pessoal !!! que absurdo !!! Vcs... com o projeto aberto no Delphi façam o seguinte: vá em Projet / Import Type Library e escolham a opção Microsoft Jet and Replication Objects 2.6 Library... Instale estas esta bibliotece de componentes Activex. Na paleta Activex vcs verão 2 novos componentes: //Cam é uma string que contém o caminho da minha aplicação. //CadC.mdb = arquivo original //C.mdb = arquivo compactado var Prov: widestring; begin Form1.Conect.Connected:=false; Prov:=´Provider=Microsoft.Jet.OLEDB.4.0;Data Source=´; Form1.JE.CompactDatabase(Prov+Cam+´CadC.mdb´,Prov+Cam+´C.mdb´); DeleteFile(Cam+´CadC.mdb´); RenameFile(Cam+´C.mdb´,Cam+´CadC.mdb´); OBS: para funcionar vcs devem ter os componente DtSets em Active False e usei DeleteFile / RenameFile, pois ele primeiramente cria um novo arquivo de banco de dados compactado, que não posso pôr o mesmo nome do antigo (ñ aceita rewrite...), então deleto o antigo e renomeio o novo com o nome original... Abraço


eu já tinha visto um exemplo desse, até tenho um que funciona.. mas soh falava em compactação e não em reparacao...tanto q soh tem uma funcao q eh a CompactDatabase.. c sabe se alem de compactar esse tb repara?

abraço..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar