получение списка таблиц БД через OLEDB
От: DENIVA Россия http://www.uml3.ru
Дата: 06.02.04 09:28
Оценка:
Привет

Такой вот вопрос.
Использую Microsoft.Jet.OLEDB.4.0 для доступа к access-овской БД.
Каким образом можно получить список всех таблиц?

Если знаете ссылочки о OLEDB (как правильнее использовать, диаграмма классов...) буду признателен.

Спасибо
Re: получение списка таблиц БД через OLEDB
От: Othello  
Дата: 06.02.04 09:42
Оценка:
Здравствуйте, DENIVA, Вы писали:

DEN>Если знаете ссылочки о OLEDB (как правильнее использовать, диаграмма классов...) буду признателен.


Загляните сюда
Re[2]: от модератора
От: Merle Австрия http://rsdn.ru
Дата: 06.02.04 10:03
Оценка:
Здравствуйте, Othello, Вы писали:

Последнее, тридцать третье предупреждение, воздержитесь все-таки от излишнего цитирования — M
Мы уже победили, просто это еще не так заметно...
Re: получение списка таблиц БД через OLEDB
От: -ViGOur- Россия www.vigour.fromru.com
Дата: 06.02.04 10:26
Оценка:
Здравствуйте, DENIVA, Вы писали:

DEN>Если знаете ссылочки о OLEDB (как правильнее использовать, диаграмма классов...) буду признателен.


Вот пример того, как добавить список таблиц в CComboBox:
1. Создаем AppWizard'ом класс производный от CRecordset:

class CTables : public CRecordset
{
    virtual CString GetDefaultConnect() { return ""; }
    virtual CString GetDefaultSQL() { return ""; }
    virtual void    DoFieldExchange(CFieldExchange*);

    void CheckRowsetError(RETCODE nRetCode);

public:
                    CTables(CDatabase* pDatabase);
    BOOL            Open(LPCSTR pszTableQualifier = NULL,
                         LPCSTR pszTableOwner = NULL,
                         LPCSTR pszTableName = NULL,
                         LPCSTR pszTableType = NULL,
                         UINT   nOpenType = forwardOnly);

    CString            m_strTableQualifier;
    CString            m_strTableOwner;
    CString            m_strTableName;
    CString            m_strTableType;
    CString            m_strRemarks;
};

2. В какой-то функции вызываем:
    CDatabase mBase;
    if (!mBase.IsOpen())
    {

try
{
        if (!mBase.Open( _T(""), 
                         FALSE, 
                         FALSE,
                         m_szDefaultConnection, 
                         FALSE))
        {
                return TRUE;
        }
        else

        GetDlgItem( IDC_CB_TABLES)->EnableWindow( TRUE);
        FillTables( &mBase);
        int selitem=m_ComboTables.FindString( 0, m_szTable);
        m_ComboTables.SetCurSel( selitem);
}
catch(CDBException e)
{
    MessageBox( e.m_strError);
}
    }


void COdbcSettings::FillTables( CDatabase *pBase)
{
    char lpszType[]="'TABLE'";
    //strcpy(lpszType, "'TABLE'");

    int nCountCB=m_ComboTables.GetCount();
    if( nCountCB!=0)
    {
        for (int i=0;i < nCountCB;i++)
        {
            m_ComboTables.DeleteString( 0);
        }
    }

    CTables *pTableset = new CTables( pBase);;
    pTableset->Open( NULL,NULL,NULL,lpszType, CRecordset::snapshot);

    int    item = 0;
    pTableset->MoveFirst();
    while (!pTableset->IsEOF())
    {
        m_ComboTables.AddString( pTableset->m_strTableName);
        TRACE("TableName = %s\n", pTableset->m_strTableName);
        item++;
        pTableset->MoveNext();
    }

    if ( pTableset!=NULL)
    {
        if ( pTableset->IsOpen())
             pTableset->Close();
        delete pTableset;
        pTableset = NULL;
    }

    m_ComboTables.SetCurSel( 0);
}

Вот и все спосок таблиц готов!
Re: получение списка таблиц БД через OLEDB
От: algol Россия about:blank
Дата: 06.02.04 10:30
Оценка:
Здравствуйте, DENIVA, Вы писали:

DEN>Такой вот вопрос.

DEN>Использую Microsoft.Jet.OLEDB.4.0 для доступа к access-овской БД.
DEN>Каким образом можно получить список всех таблиц?

Если речь идет о VC++ и используются ATL OLEDB templates, то см. в разделе "Schema Rowset Classes and Typedef Classes" СTables и CSchemaRowset. Или вручную примерно так:
    if (session.m_spOpenRowset == NULL)
        return Error(INVALIDCONN);

    CComPtr<IDBSchemaRowset> spSchemaRowset;
    HRESULT hr = session.m_spOpenRowset->QueryInterface(&spSchemaRowset);
    if (FAILED(hr)) return hr;

    CComVariant pvarRestrictions[4];
    if (SysStringLen(TableTypes) != 0)  // Тип таблицы - Table, View
        pvarRestrictions[3] = TableTypes;

    CCommand<CManualAccessor> rs;
    hr = spSchemaRowset->GetRowset(NULL, DBSCHEMA_TABLES, 4, pvarRestrictions,
        IID_IRowset, 0, NULL, (IUnknown**)&rs.m_spRowset);
    if (FAILED(hr)) return hr;
Re[2]: получение списка таблиц БД через OLEDB
От: algol Россия about:blank
Дата: 06.02.04 10:36
Оценка:
Здравствуйте, -ViGOur-, Вы писали:

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


DEN>>Если знаете ссылочки о OLEDB (как правильнее использовать, диаграмма классов...) буду признателен.


VGO>Вот пример того, как добавить список таблиц в CComboBox:

VGO>1. Создаем AppWizard'ом класс производный от CRecordset:

Читаем внимательно вопрос. При чем здесь ODBC?
Re[2]: получение списка таблиц БД через OLEDB
От: DENIVA Россия http://www.uml3.ru
Дата: 06.02.04 11:59
Оценка:
algol,
Спасибо за ответ. То что надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.