Здравствуйте, DENIVA, Вы писали:
DEN>Если знаете ссылочки о OLEDB (как правильнее использовать, диаграмма классов...) буду признателен.
Загляните
сюда
Здравствуйте, Othello, Вы писали:
Последнее, тридцать третье предупреждение, воздержитесь все-таки от излишнего цитирования — M
Здравствуйте, 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);
}
Вот и все спосок таблиц готов!
Здравствуйте, 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;