Програмное создание БД Access
От: Mortius  
Дата: 24.05.06 12:48
Оценка:
Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?
Заранее спасибо!

07.06.06 12:24: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Програмное создание БД Access
От: korzhik Россия  
Дата: 24.05.06 14:12
Оценка:
Здравствуйте, Mortius, Вы писали:

M>Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?

M>Заранее спасибо!

Можно с помощью ADOX
Re[2]: Програмное создание БД Access
От: Mortius  
Дата: 24.05.06 14:19
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, Mortius, Вы писали:


M>>Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?

M>>Заранее спасибо!

K>Можно с помощью ADOX


А можно подробнне? =))
Желательно с примером.
Re[3]: Програмное создание БД Access
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 24.05.06 15:00
Оценка:
Здравствуйте, Mortius, Вы писали:

K>>Можно с помощью ADOX

M>А можно подробнне? =))
M>Желательно с примером.

http://gzip.rsdn.ru/?article/files/progs/BatchAccess.xml
Автор(ы): Никита А. Зимин
Дата: 14.12.2005
BatchAccess — небольшая утилита, написанная в компании Русские Информационные Технологии. Мы создали ее в ходе работы над программным продуктом, работающим с базой данных MS Access.
Целью было — перейти от описания базы средствами Access к описанию в виде SQL-скрипта.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Програмное создание БД Access
От: ak_miass Россия  
Дата: 25.05.06 07:16
Оценка:
Здравствуйте, Mortius, Вы писали:

M>Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?


Способ тупой, но сам его использую уже давно и проблем ещё не возникало. Просто копирую пустую заготовку БД в нужное место. Кривовато конечно, зато без лишнего гимора.
Re[4]: Програмное создание БД Access
От: Аноним  
Дата: 25.05.06 08:46
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, Mortius, Вы писали:


K>>>Можно с помощью ADOX

M>>А можно подробнне? =))
M>>Желательно с примером.

OE>http://gzip.rsdn.ru/?article/files/progs/BatchAccess.xml
Автор(ы): Никита А. Зимин
Дата: 14.12.2005
BatchAccess — небольшая утилита, написанная в компании Русские Информационные Технологии. Мы создали ее в ходе работы над программным продуктом, работающим с базой данных MS Access.
Целью было — перейти от описания базы средствами Access к описанию в виде SQL-скрипта.


Это все конечно хорошо, но вязаться с фреймверком нехочется!
Re[2]: Програмное создание БД Access
От: Demiurg  
Дата: 25.05.06 08:47
Оценка:
Здравствуйте, ak_miass, Вы писали:

M>>Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?


_>Способ тупой, но сам его использую уже давно и проблем ещё не возникало. Просто копирую пустую заготовку БД в нужное место. Кривовато конечно, зато без лишнего гимора.


А некоторые товарищи еще рулят акцессовским процессом
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Програмное создание БД Access
От: ak_miass Россия  
Дата: 25.05.06 10:18
Оценка:
Здравствуйте, Demiurg, Вы писали:

D> А некоторые товарищи еще рулят акцессовским процессом


Через OLE автоматизацию? А если офис не установлен?
Re[4]: Програмное создание БД Access
От: Demiurg  
Дата: 25.05.06 11:01
Оценка:
Здравствуйте, ak_miass, Вы писали:

D>> А некоторые товарищи еще рулят акцессовским процессом


_>Через OLE автоматизацию? А если офис не установлен?


Очевидно, что тогда такой способ не сработает Но мне он и так не нравится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Програмное создание БД Access
От: Kapone Украина  
Дата: 26.05.06 11:21
Оценка:
Здравствуйте, Mortius, Вы писали:

M>Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?

M>Заранее спасибо!

#pragma once
#include "msjetodb.h"
class CJetDataConnection : public CDataConnection
{
    HRESULT OpenExistingFile(LPCTSTR strFilePath, LPCTSTR strPassword, bool bExclusively = false)
    {
        USES_CONVERSION;

        HRESULT result;
        
        CDBPropSet dbinit[2];
        dbinit[0].SetGUID(DBPROPSET_DBINIT);
        dbinit[0].AddProperty( DBPROP_INIT_DATASOURCE, 
                               T2BSTR(strFilePath));
        
        if (bExclusively)
        {
            dbinit[0].AddProperty( DBPROP_INIT_MODE, 
                                   (long)DB_MODE_SHARE_EXCLUSIVE);
        }
        
        dbinit[1].SetGUID(DBPROPSET_JETOLEDB_DBINIT);
        dbinit[1].AddProperty( DBPROP_JETOLEDB_DATABASEPASSWORD, T2BSTR(strPassword));
        dbinit[1].AddProperty( DBPROP_JETOLEDB_ENCRYPTDATABASE, true);
        dbinit[1].AddProperty( DBPROP_JETOLEDB_ENGINE, (long)JETDBENGINETYPE_JET4X);
        
        result = m_source.Open(_T("Microsoft.Jet.OLEDB.4.0"), dbinit, 2);

        return result;
    }
    //
    ///////////////////////////////////////////////////////////////////////////
    //
    HRESULT OpenNewFile(LPCTSTR strFilePath, LPCTSTR strPassword, bool bExclusively = true)
    {
        USES_CONVERSION;
        CComPtr<IDBInitialize>      DbInit;
        CComPtr<IDBDataSourceAdmin> DbAdmin;

        HRESULT  result;
        CLSID    clsid;
        LPWSTR   szProgID = L"Microsoft.Jet.OLEDB.4.0";

        result = CLSIDFromProgID(szProgID, &clsid);    
        
        if (FAILED(result)) 
        {
            return result;
        }
        
        result = CoCreateInstance( clsid, 
                                   NULL, 
                                   CLSCTX_INPROC_SERVER, 
                                   __uuidof(IDBInitialize),
                                   (void**)&DbInit);
        if (FAILED(result)) 
        {
            return result;
        }
        result = DbInit->QueryInterface( IID_IDBDataSourceAdmin,
                                         (void**)&DbAdmin );
        if (FAILED(result)) 
        {
            return result;
        }
        CDBPropSet dbinit[2];
        dbinit[0].SetGUID(DBPROPSET_DBINIT);
        dbinit[0].AddProperty(DBPROP_INIT_DATASOURCE, T2BSTR(strFilePath));

        if (bExclusively)
        {
            dbinit[0].AddProperty( DBPROP_INIT_MODE, (long)DB_MODE_SHARE_EXCLUSIVE);
        }

        dbinit[1].SetGUID(DBPROPSET_JETOLEDB_DBINIT);
        dbinit[1].AddProperty( DBPROP_JETOLEDB_DATABASEPASSWORD, T2BSTR(strPassword));
        dbinit[1].AddProperty( DBPROP_JETOLEDB_ENCRYPTDATABASE, true);
        dbinit[1].AddProperty( DBPROP_JETOLEDB_ENGINE, (long)JETDBENGINETYPE_JET4X);
        

        result = DbAdmin->CreateDataSource(2, dbinit, NULL, IID_NULL, NULL);
        if (SUCCEEDED(result)) 
        {
            DbAdmin.Release();
            DbInit.Release();

            result = m_source.Open(clsid, dbinit, 2);
        }
        DbAdmin.Release();
        DbInit.Release();
        return result;
    }
};
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Програмное создание БД Access
От: korzhik Россия  
Дата: 03.06.06 11:04
Оценка:
Здравствуйте, Mortius, Вы писали:

M>Здравствуйте, korzhik, Вы писали:


K>>Здравствуйте, Mortius, Вы писали:


M>>>Для соединения с БД использую ATLOleDbConsumer, но проблемма в том, что он работает с существующей БД, а мне необходимо програмно создать базу данных (create database....)Как это можно зделать?

M>>>Заранее спасибо!

K>>Можно с помощью ADOX


M>А можно подробнне? =))

M>Желательно с примером.

наводил порядок на харде, случайно наткнулся на пример.
Программа создаёт пустую базу test.mdb а потом создаёт в ней таблицу MyCustomers с двумя полями
//-----------------------------------------------------------------------------
#import "C:/Program Files/Common Files/System/ADO/msadox.dll" 
#import "C:/Program Files/Common Files/System/ADO/msado15.dll"
//-----------------------------------------------------------------------------
#include "windows.h"
#include <iostream>
//-----------------------------------------------------------------------------
const char     bd_name[] = "test.mdb"; 
const unsigned max_path  = 1000;
//-----------------------------------------------------------------------------
struct tagInitCom
{
    tagInitCom() { ::CoInitialize( NULL ); }
   ~tagInitCom() {    ::CoUninitialize(); }
} InitCom;
//-----------------------------------------------------------------------------
_bstr_t GetDBFileName()
{
    char buf[max_path];
    
    unsigned int size = GetModuleFileName(NULL, buf, max_path);

    while (buf[size--] != '\\');
    
    buf[size + 2] = 0;
    
    lstrcat(buf, bd_name);
    
    return _bstr_t(buf);
}
//-----------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    ADOX::_CatalogPtr       pCatalog    = NULL;
    ADODB::_ConnectionPtr    pConnection = NULL;

    _bstr_t     command_str    = "CREATE TABLE MyCustomers (ID integer PRIMARY KEY, NAME integer)";
    _bstr_t        connection_str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
    
    connection_str += GetDBFileName();

    try {

// Create Database        

        pCatalog.CreateInstance(__uuidof (ADOX::Catalog));

        pCatalog->Create( connection_str );    

// Create Table
        pConnection = pCatalog->GetActiveConnection();

        pConnection->Execute( command_str, NULL, -1 );

    }
    catch(_com_error *e)
    {
        std::cerr << e->ErrorMessage() << std::endl;
    }
    catch(...)
    {
        std::cerr << "Error" << std::endl;
    }

    return 0;
}
Re[5]: Програмное создание БД Access
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.06.06 12:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

K>>>>Можно с помощью ADOX

M>>>А можно подробнне? =))
M>>>Желательно с примером.

OE>>http://gzip.rsdn.ru/?article/files/progs/BatchAccess.xml
Автор(ы): Никита А. Зимин
Дата: 14.12.2005
BatchAccess — небольшая утилита, написанная в компании Русские Информационные Технологии. Мы создали ее в ходе работы над программным продуктом, работающим с базой данных MS Access.
Целью было — перейти от описания базы средствами Access к описанию в виде SQL-скрипта.

А>Это все конечно хорошо, но вязаться с фреймверком нехочется!

ADOX сам по себе фреймворка не требует, просто в этом примере он используется из .NET. Вот тебе например copy/paste из MSDN:

// BeginCreateDatabaseCpp
#import "msado15.dll"
#import "msadox.dll" no_namespace

#define TESTHR(x) if FAILED(x) _com_issue_error(x);

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
void CreateDatabaseX(void);

//------------------------------------------------------------//
//Main Function                                    
//Purpose:  Test Driver
//------------------------------------------------------------//
void main()
{
    HRESULT hr = S_OK;

    hr = ::CoInitialize(NULL);
    if(SUCCEEDED(hr))
    {
        CreateDatabaseX();

        //Wait here for the user to see the output
        printf("Press any key to continue...");
        getch();
        
        ::CoUninitialize();
    }
}

//------------------------------------------------------------//
//CreateDatabaseX                                
//Purpose:  create a new Jet database with the Create method
//------------------------------------------------------------//
void CreateDatabaseX()
{    
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    
    _CatalogPtr m_pCatalog = NULL;

    
    //Set ActiveConnection of Catalog to this string
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
                "Data source = c:\\new.mdb");
    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->Create(strcnn);
        printf("Database 'c:\\new.mdb' is created.\n");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());
          
        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);

    }
    catch(...)
    {
        cout << "Error occured in CreateDatabaseX...."<< endl;
    }

}
// EndCreateDatabaseCpp

ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/ado270/htm/admthcreatexvc.htm
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Програмное создание БД Access
От: neiroman Украина  
Дата: 10.06.06 07:29
Оценка:
_>Способ тупой, но сам его использую уже давно и проблем ещё не возникало. Просто копирую пустую заготовку БД в нужное место. Кривовато конечно, зато без лишнего гимора.
Если еще больше извратится, можно засунуть заготовку в ресурсы программы, а потом просто вытянуть куда нужно.
Это сообщение написано при активной поддержке Apocalyptica — Somwhere Around Nothing
Слова, пустые слова, подумал Стормгрен. Слова, за которые прежде люди дрались и умирали, но никогда больше не станут за них ни умирать, ни драться. И от этого мир станет лучше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.