Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как программно сжать MDB-файл 
V
    Опции темы
Alca
Дата 21.9.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Как программно сжать MDB-файл?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Rodman
Дата 21.9.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Код

Если pаботаешь чеpез ADO, то можно pyками. WSCurrConn должна быть
ConnectionString текyщего TADOConnection, WSTempDB - пyть к вpеменной базе.
Потом пеpеименовываешь вpеменнyю в текyщyю и все. Hy есессно y пользователя
должны быть пpава и на момент сжатия всех надо отключить.

Код

WideString WSCurrConn, WSTempDB;
Variant JE = Variant::CreateObject ("JRO.JetEngine");
try
{
 HRESULT hResult = JE.OleFunction ("CompactDatabase",  WSCurrConn,
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + WSTempDB);
}
__finally
{
 JE = Unassigned;
}


Это сообщение отредактировал(а) Rodman - 21.9.2007, 13:36
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Alca
Дата 21.9.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

void __fastcall TfrmMain::Button1Click(TObject *Sender) {
    WideString WSCurrConn, WSTempDB;
    WSCurrConn = WideString(ADOConnection1->ConnectionString);
    WSTempDB   = WideString("c://");
    Variant JE = Variant::CreateObject ("JRO.JetEngine");
    try {
        HRESULT hResult = JE.OleFunction ("CompactDatabase", WSCurrConn, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + WSTempDB);
    }
    __finally {
        JE = Unassigned;
    }
}

Неверный тип переменной...

Это сообщение отредактировал(а) Alca - 21.9.2007, 14:10


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 21.9.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Сделал так:
Код

HRESULT hResult = vJE.OleFunction ("CompactDatabase", wsCurrConn, (WideString)("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + wsTempDB));


Пишет: Ошибка.



--------------------
PM WWW ICQ Skype Jabber   Вверх
Rodman
Дата 21.9.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Цитата(Alca @  21.9.2007,  15:23 Найти цитируемый пост)
Пишет: Ошибка.

вердикт на лицо... ошибку в студию!!!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Alca
Дата 21.9.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleSysError with message 'Ошибка'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

Код

void __fastcall TForm1::btnStartClick(TObject *Sender) {
    WideString wsCurrConn = "Provider=MSDASQL.1;Persist Security Info=True;Mode=ReadWrite;Extended Properties=\"DBQ=C:\\Documents and Settings\\Администратор\\Мои документы\\XXXDb.mdb;DefaultDir=C:\\Documents and Settings\\Администратор\\Мои документы;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;Exclusive=1;FIL=MS Access;FILEDSN=C:\\Program Files\\Common Files\\ODBC\\Data Sources\\XXXDb.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ReadOnly=0;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;";
    WideString wsTempDB   = "c:";
    Variant vJE = Variant::CreateObject("JRO.JetEngine");
    try {
        HRESULT hResult = vJE.OleFunction ("CompactDatabase", wsCurrConn, (WideString)("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + wsTempDB));
    }
    __finally {
        vJE = Unassigned;
    }
}

Может что-то необходимо заинклюдить?

Это сообщение отредактировал(а) Alca - 21.9.2007, 20:35


--------------------
PM WWW ICQ Skype Jabber   Вверх
Programister0
Дата 24.9.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



вообще гдето есть компонент zip для bildera.

Добавлено через 3 минуты и 29 секунд
библиотека Zlib
PM MAIL WWW ICQ Skype   Вверх
jonie
Дата 24.9.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 4
Всего: 118



Programister0 не в тему. Она про сжатие именно БД (если угодно, то уплотнение удаленных частей из файла) как я понимаю....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Programister0
Дата 25.9.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



а пнял это типа ф-ии PACK() в sql
PM MAIL WWW ICQ Skype   Вверх
Alca
Дата 15.10.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Нашел такое, но ошибка таже
Код

bool __stdcall CompactMDB(AnsiString mdb,AnsiString pass1,AnsiString pass2)
{
   bool ReturnValue;
   AnsiString tmp=ChangeFileExt(mdb,".tmp");
   AnsiString Provider1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+mdb+";Jet OLEDB:Engine Type=4";
   AnsiString Provider2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tmp+";Jet OLEDB:Engine Type=4";
   Variant AdoObj;
    try
     {
       if(FileExists(tmp)) DeleteFile(tmp);
       try
        {
          //AdoObj = CreateOleObject("JRO.JetEngine");
          AdoObj = Variant::CreateObject("JRO.JetEngine");
        }
       catch(Exception &ee)
        {
           ShowMessage("Err1 = "+ee.Message);
        };

       try
        {
          AdoObj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str());  //<-- валится тут
        }
       catch(Exception &ee1)
        {
          ShowMessage("ErrComp = "+ee1.Message+"Возможно файл "+mdb+"занят другим приложением");  //<-- "Ошибка"
        };
       //CopyFile(tmp.c_str(),mdb.c_str(),false);
       if(FileExists(mdb)) DeleteFile(mdb);
        RenameFile(tmp,mdb);
        ReturnValue=true;
      }
    catch(Exception &e)
      {
        ShowMessage("Err2 " + e.Message);
        ReturnValue=false;
      }
     AdoObj.Clear();
     return ReturnValue;
}
//-----------------------------------------------------------------

Код

ErrComp = Ошибка







--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 3.3.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Builder C++ 6.0, Microsoft Office Access 2003
Код

#include <ComObj.hpp>
//---------------------------------------------------------
bool __stdcall CompactMDB(AnsiString mdb,AnsiString pass1,AnsiString pass2) {
   bool ReturnValue;
   AnsiString tmp=ChangeFileExt(mdb,".tmp");
   AnsiString Provider1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+mdb+";Jet OLEDB:Database Password="+pass1;
   AnsiString Provider2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tmp+";Jet OLEDB:Database Password="+pass2;
   Variant AdoObj;
    try
     {
       if(FileExists(tmp)) DeleteFile(tmp);
       // AdoObj = CreateOleObject("JRO.JetEngine");
       AdoObj = Variant::CreateObject("JRO.JetEngine");
       AdoObj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str());
       if(FileExists(mdb)) DeleteFile(mdb);
        RenameFile(tmp,mdb);
        ReturnValue=true;
      }
    catch(Exception &e)
      {
        ShowMessage("Err2 " + e.Message);
        ReturnValue=false;
      }
     AdoObj.Clear();
     return ReturnValue;
}
//---------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender) {
   ADOConnection1->Connected = false;  // отваливаюсь от базы
   CompactMDB("tempbd.mdb","","");  // типа сжал 
   ADOConnection1->Connected = true; // все больше не открывает
}
//---------------------------------------------------------


Это сообщение отредактировал(а) Alca - 3.3.2008, 12:52


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 14.6.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



http://rxlib.ru/forums/index.php?act=ST&f=4&t=963
Цитата

Есть например учебная база bcdemos.mdb и надо ее сжать.
"C:\Program Files\Common Files\Borland Shared\Data\bcdemos.mdb"

В ADOConnection1 ConnectionString получился следующий
(выбираем провайдера !!! - Microsoft Jet 4.0 OLE DB
- а у Вас я так понимаю стоит MSDASQL.1)

Код

Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Program Files\Common Files\Borland Shared\Data\bcdemos.mdb;
Mode=Share Deny Read|Share Deny Write;
Extended Properties="";
Persist Security Info=False;
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=5;
Jet OLEDB:Database Locking Mode=1;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False

По нажатию кнопки сжимаем базу:
Код

void __fastcall TForm1::Button1Click(TObject *Sender) {
   WideString WSCurrConn = ADOConnection1->ConnectionString;

   Variant JE = Variant::CreateObject("JRO.JetEngine");
   try{
   try{
      TAutoArgs<2> args;
      args[1] = WSCurrConn;
      args[2] = "Provider=Microsoft.Jet.OLEDB.4.0;"
                       "Data Source=c:\\---\\myTmp.mdb";
     HRESULT hRes = JE.OleFunction("CompactDatabase",
                             static_cast<TAutoArgsBase*>(&args));
   }
  catch(Exception& ex){
   ShowMessage("Error: "+ex.Message);
   }}
     __finally{ JE = Unassigned;
    }
}

Сжатая база с именем myTmp.mdb появляется 
в папке "с:\---"


Это сообщение отредактировал(а) Alca - 14.6.2010, 16:03


--------------------
PM WWW ICQ Skype Jabber   Вверх
Albor
Дата 22.6.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: нет
Всего: 9



Отрывок из проекта с использованием MFC. Возможно поможет.
Код

#pragma once
#include <afx.h>
#include <afxdisp.h>
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\ado\MSJRO.DLL" no_namespace

class CJetEngine
{
public:

    CJetEngine(){;}
    virtual ~CJetEngine(){;}
    static BOOL CCompactDatabase(CString strDatabaseSource, CString strDatabaseDestination);
};

Код

BOOL CJetEngine::CCompactDatabase(CString strDatabaseSource, CString strDatabaseDestination)
{
    try
    {
        ::CoInitialize(NULL);
        IJetEnginePtr jet(__uuidof(JetEngine));        
        HRESULT hr = jet->CompactDatabase(_bstr_t(strDatabaseSource.GetBuffer(0)), _bstr_t(strDatabaseDestination.GetBuffer(0)));
        ::CoUninitialize();
        return hr == S_OK;
    }
    catch(_com_error &e) 
    {  
        CString ErrorStr;
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());
        ErrorStr.Format( _T("Ошибка в работе с ADOJetEngine\nИсточник = %s\nОписание = %s\n"),
            CString((LPCSTR)bstrSource), CString((LPCSTR)bstrDescription));
        AfxMessageBox(ErrorStr, MB_OK | MB_ICONERROR );
        ::CoUninitialize();
        return FALSE;
    } 
}

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.