Программно сжать базу Access, MSVC...
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\your.mdb;" - у меня работает... и IJetEngine там есть
ps. я делал как раз через IJetEngine.CompactDatabase
Вот еще ms-help://MS.MSDNQTR.2003OCT.1033/sqlce/htm/_lce_compactdatabase_method_705.htm
А как заставить работать IJetEngine? Я просто ни разу COM не использовал... Что сделать надо, кроме
#import "C:\PROGRAM FILES\COMMON FILES\System\ado\MSJRO.DLL" no_namespace
?
И что за ссылка хитрая ms-help://, это в MSDN .NET?
HOWTO: Compact Microsoft Access Database Through ADOPSS ID Number: 230501
Article Last Modified on 4/22/2003
SUMMARY
Although ADO specification does not provide objects to compact Microsoft Access databases, this capability can be achieved by using the ADO extension: Microsoft Jet OLE DB Provider and Replication Objects (JRO). This capability was implemented for the first time in the JET OLE DB Provider version 4.0 (Msjetoledb40.dll) and JRO version 2.1 (Msjro.dll). These DLL files are available after the install of MDAC 2.1. You can download the latest version of MDAC from the following Web site:
Universal Data Access Web Site
MORE INFORMATION
To compact an Access database using ADO, MDAC 2.1 or later must be properly installed on the computer. The following are the main steps to compact a Microsoft Access database using Visual Basic and Visual C++:
Visual Basic: Compacting an Access Database via ADO
In the Visual Basic IDE, on the Projects menu, click References.
Add Microsoft Jet and Replication Objects X.X library, where (X.X is greater than or equal to 2.1).
Add the following lines of code to Visual Basic, replacing the data source and destination database paths if needed:
Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\nwind2.mdb", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\abbc2.mdb;Jet OLEDB:Engine Type=4"
NOTE: In DAO 3.60, the RepairDatabase method is no longer available. The above code shows the use of the CompactDatabase method. This method replaces the DAO 3.5 RepairDatabase method.
Visual C++: Compacting an Access Database via ADO
Besides #import, the Msado15.dll (MDAC2.1 add the following #import statement to generate the wrapper classes for JRO to your .cpp classes (alternatively, you can generate the wrapper classes more efficiently by using the no_implementation and implementation_only attributes of the #import pre-processor statement):
#import "C:\PROGRAM FILES\COMMON FILES\System\ado\MSJRO.DLL" no_namespace
Add the following (specifying your own source and destination database paths) to the .cpp file where you want to compact the database:
...
try
{
IJetEnginePtr jet(__uuidof(JetEngine;
jet->CompactDatabase(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc.mdb;" \
"Jet OLEDB:Engine Type=4");
}
catch(_com_error &e)
{
::MessageBox(NULL, (LPCTSTR)e.Description( "", MB_OK) ;
}
NOTE: The Jet OLEDB:Engine Type=4 is only for Jet 3.x format MDB files. If this value is left out, the database is automatically upgraded to the 4.0 version (Jet OLEDB:Engine Type=5). See the following table for appropriate values for Jet OLEDB:Engine Type:
Jet OLEDB:Engine Type Jet x.x Format MDB Files
1 JET10
2 JET11
3 JET2X
4 JET3X
5 JET4X
REFERENCES
For additional information, please see the following article in the Microsoft Knowledge Base:
230496 Compacting Microsoft Access database via OLE DB
Additional query words: CompactDatabase RepairDatabase reindex
--------------------------------------------------------------------------------
© 2003 Microsoft Corporation. All rights reserved.
Если используете CDaoWorkspace (я в этом слаб) то действительно надо указывать имя файла, а не строку соединения. Но мне кажется это не работает для jet4.0 (текущая версия) только для версии <= jet3.0. Как работать с COM в C++ примерно представляю... что это геморойно. Для начала надо заинклудить файл adojet.h (MS Platform SDK). Я все писал на VB6 & C#. Это ссылка на октябрьский msdn, если у Вас другая - просто замените в ссылке слово OCT на нужную версию
Although ADO specification does not provide objects to compact Microsoft Access databases, this capability can be achieved by using the ADO extension: Microsoft Jet OLE DB Provider and Replication Objects (JRO). This capability was implemented for the first time in the JET OLE DB Provider version 4.0 (Msjetoledb40.dll) and JRO version 2.1 (Msjro.dll). These DLL files are available after the install of MDAC 2.1.То есть без установки MDAC не обойтись? Его же наверняка придётся распространять вместе с программой тогда...
Visual C++: Compacting an Access Database via ADO
Besides #import, the Msado15.dll (MDAC2.1 add the following #import statement to generate the wrapper classes for JRO to your .cpp classes (alternatively, you can generate the wrapper classes more efficiently by using the no_implementation and implementation_only attributes of the #import pre-processor statement):
#import "C:\PROGRAM FILES\COMMON FILES\System\ado\MSJRO.DLL" no_namespace
Оба указанных длля есть у меня и без MDAC, как вот только их использовать... MSJRO.dll подключаю как написано, для Msado15.dll написал такую же строчку. В директории компиляции создаются файлы .tlh и .tli. Их надо подключать в проект?
Для начала надо заинклудить файл adojet.h (MS Platform SDK).
А где его достать? (Я не очень представляю, что такое SDK, я только на DDK дрова писал...)
А насчёт MSDN - у меня версия 98 года, как я понял из названия директории
Там ещё нет этого хитрого механизма ссылок ms-help:// ?
Пишу на VC 6.
Раскрой секрет, откуда возникла необходимость жать базы msaccess из VC?
Это проще было написать на чём-то ещё, но быстрее было написать на Си, чем учить что-то... А на PHP тоже не хотелось, ставить сложно у клиента
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb"
strConnBak = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.bak.mdb"
Set objJRO = CreateObject("JRO.JetEngine")
objJRO.CompactDatabase strConn, strConnBak
Устанавливать ничего не нужно, сделал текстовый файл с расширением vbs, dblclick и готово
Если таки не получится этот JetEngine из Си активировать, придётся запускать скрипт на Бейсике... Извраат
Оставить комментарий
Tata2032
Такой код:CDaoWorkspace DWS;
DWS.CompactDatabase(File1Name, File2Name);
вызывает ошибку "неизвестная версия .mdb файла", хотя файл создаётся моей же программой...
Нашёл в инете, что можно сжать с использованием COM-объекта IJetEngine из msjro.dll, однако не получилось подключить длл так, чтобы в пространстве имён появился IJetEngine.
Подскажите что-нибудь, плиз...