Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Создание файла *.mdb


Автор: Syrex 6.3.2007, 15:55
Помогите создать файл для MS Access средствами Билдера

Автор: TaNK 6.3.2007, 19:50
http://forum.vingrad.ru/index.php?showtopic=46810&view=findpost&p=362837
http://forum.vingrad.ru/index.php?showtopic=102427&view=findpost&p=778253

Автор: Syrex 7.3.2007, 11:32
Это все не то. После создания файла MS Access в него добавляется какая-то инфа. А если создать файл методом FileCreate - то Access его не понимает!!!

Автор: _hunter 7.3.2007, 12:07
http://www.cyberguru.ru/programming/delphi/delphi-ado-extensions.html
(delphi)

Автор: Rodman 7.3.2007, 12:13
Syrex, вот тебе на Делфях... попробуй изменить...
Код

procedure CreateMSAccessDB(filename : String);
var
    DBEngine, Workspace: Variant;
const
{Important to use the following constant as is}
   dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0';
   dbVersion30 = 64;
begin
    if not FileExists(FileName+'.mdb') then 
    begin
    //DBEngine := CreateOleObject('DAO.DBEngine');
        DBEngine := CreateOleObject('DAO.DBEngine.36'); //For DAO 3.5
       Workspace := DBEngine.Workspaces[0];
        try
           Workspace.CreateDatabase(filename, dbLangGeneral, dbVersion30);
           except on EOleException do
            ShowMessage('Невозможно создать!');
        end;
    end;
end;

Автор: Syrex 9.3.2007, 11:58
Я не очень силен в Паскале. Может кто поможет перевести!!

Автор: Syrex 20.11.2007, 14:19
UP

Автор: ama_kid 20.11.2007, 15:02
Syrex, можешь так попробовать:
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OleVariant cat;
AnsiString ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\123.mdb;";
try
    {
        cat = CreateOleObject("ADOX.Catalog");
        Procedure Create("Create");
        cat.Exec(Create << ConnectionString);
        cat = NULL;
    }
catch(...)
    {

    }
}


Автор: Syrex 20.11.2007, 17:16
Компилятор не понимает что такое  CreateOleObject smile 

Автор: ama_kid 20.11.2007, 18:15
Цитата(Syrex @  20.11.2007,  17:16 Найти цитируемый пост)
Компилятор не понимает что такое  CreateOleObject

Код
#include <ComObj.hpp>

Автор: Alca 20.11.2007, 21:23
Код

Variant does not reference an automation object.


Автор: Syrex 22.11.2007, 09:19
Может ещё ксть у кого-нибудь варианты?

Автор: Alca 3.3.2008, 13:01
Лучше поздно, чем никогда...
Builder C++ 6.0, Microsoft Office Access 2003  smile 
Код

#include <ComObj.hpp>

//---------------------------------------------------------------------------
void __fastcall TfrmMain::Button1Click(TObject *Sender) {
    Variant vADO;
    WideString ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\123.mdb;";
    try {
        vADO = Variant::CreateObject("ADOX.Catalog");
        Procedure Create("Create");
        vADO.Exec(Create << ConnectionString);
        vADO = NULL;
    } catch(Exception &e) {
        ShowMessage("Err: " + e.Message);
    }
}
//---------------------------------------------------------------------------

Автор: mrbrooks 3.3.2008, 13:18
Кул ИМХО - все работает и с Microsoft Office Access 2000  smile на мой взгляд заслуженно +1 к репе

Автор: Alca 3.3.2008, 13:51
Похоже этот код должен работать без установленного Microsoft Office Access, т.к. работает через ADO.

Автор: mrbrooks 3.3.2008, 14:13
Цитата(mrbrooks @ 3.3.2008,  13:18)
Кул ИМХО - все работает и с Microsoft Office Access 2000  smile на мой взгляд заслуженно +1 к репе

Собственно это я и имел ввиду  smile 
вот тоже вполне рабочий примерчик.
Код

include <ComObj.hpp>
//...
void __fastcall TFExport::CreateDB() {
  String dbdir = ExtractFilePath(FContMain->SrcName);  // подставь своё имя источника
  String dbname = DateToStr(Date());
  for (int i = 0; i < dbname.Length(); i++)            // и сформируй своё имя приёмника
    if (dbname.c_str()[i] == '.')
      dbname.c_str()[i] = '_';
  char buf[1024];
  sprintf(buf, "%sbmd_exp_%02d_%s.MDB", dbdir.c_str(), FContMain->EntId, dbname.c_str());  // само имя БД
  String DstName = String(buf);
  sprintf(buf, "%sbmd_exp_%02d_%s.LOG", dbdir.c_str(), FContMain->EntId, dbname.c_str());  // имя лога
  String RepName = String(buf);
  //-------------------------------------------------------------------------
  if (FileExists(DstName)) {
    SetFileAttributes(DstName.c_str(), FILE_ATTRIBUTE_NORMAL);
    DeleteFile(DstName);
    // или наоборот - сообщить, что такая база уже есть и закончить работу, сам выбирай
  }
  WideString name = WideString(DstName);
  Variant acs = CreateOleObject("Access.Application");
  acs.OleFunction("NewCurrentDatabase", name);
  acs.OleFunction("Quit");
  acs = Unassigned;
  sprintf(buf, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False", DstName.c_str());
  Conn->ConnectionString = String(buf);
  Conn->Connected = true;


Автор: Syrex 3.3.2008, 21:19
Безгранично благодарен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)