Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ODBC + MFC, Как получить имена всех таблиц БД 
V
    Опции темы
Kirow
Дата 10.10.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть диалоговое окно со списком и кнопкой по нажатию на которую выполняется следующий код:
Код

        CDatabase database;
    CString sSql;
    CString sItem1, result;
    CString sDriver;
    CString sDsn;
    CString sFile = "...\\Пример БД.mdb"; //либо .xls/.xlsx        
    m_ctrlList.ResetContent();

    sDriver = GetExcelDriver(); //функция получения драйвера ODBC
    if( sDriver.IsEmpty() )
    {
        AfxMessageBox("No Excel ODBC driver found");
        return;
    }

    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);

    TRY
    {        
        database.Open(NULL,false,false,sDsn);        
        CRecordset recset( &database );
                
        sSql = "SELECT * FROM AccessDB2 "; //тут таблицу AccessDB2  указываю вручную прямо в коде, что не есть 
                                                                       //хорошо т.к. это привязывает программу к одной единственной таблице 
        recset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

//Получаю заголовки всех полей
        CODBCFieldInfo info;
        for (int i = 0; i < recset.GetODBCFieldCount();i++)
        {
            recset.GetODBCFieldInfo(i, info);
            sItem1 = info.m_strName;
            result += sItem1 +" ";
        }
        m_ctrlList.AddString(result);

//считываю все записи из таблицы
        while( !recset.IsEOF() )
        {
            // Read the result line
            result = " ";
            
            for (int i = 0; i < recset.GetODBCFieldCount();i++)
            {
                recset.GetFieldValue(i,sItem1);
                result += sItem1 +" ";
            }

            m_ctrlList.AddString(result);
            recset.MoveNext();
        }        
        database.Close();
    }
    CATCH(CDBException, e)
    {
        // A database exception occured. Pop out the details...
        AfxMessageBox("Database error: "+e->m_strError);
    }
    END_CATCH;


Вопрос заключается в следующем, как программно получить список таблиц подключенной БД. Вариант с использованием системной таблицы (как в Access например MSysObjects) не подходит ввиду того что надо использовать разные источники, а судя по всему имена системных таблиц везде разные (хотя не прочь узнать как получить доступ к этой таблице, т.к. у меня  "no read permission" на примере Access'a).
Пытался с помощью SQLTable  из ODBC API выковырять нужные данные, но вместо имен таблиц получал пути к файлам (либо не правильно делал, либо не предназначено для этого).
В общем если кто-то может подсказать как отталкиваясь от классов CDatabase и CRecordset либо ODBC API можно получить список имен таблиц, буду благодарен.

UPD: Уже нашел решение на примере простого отрывка кода
Код

SQLHSTMT hstmt; 
if (SQLAllocStmt(cdb.m_hdbc,&hstmt)==SQL_SUCCESS) 
{ 
   if (SQLTables(hstmt, NULL,0, NULL,0, NULL,0, NULL,0)==SQL_SUCCESS) 
   { 
      SQLRETURN retcode = 0; 
      char Res[128]; 
      CString ResC; 
      SQLINTEGER ResCount = 0; 
      SQLFetch(hstmt); 
      while (retcode != SQL_NO_DATA) 
      { 
         SQLGetDatahstmt,4,SQL_C_DEFAULT,&Res,128,&ResCount); 
               ResC = Res; 
               if (ResC=="TABLE") 
               { 
                  SQLGetData(hstmt,3,SQL_C_DEFAULT,&Res,128,&ResCount); 
                  m_Combo.AddString(Res); 
               } 
               retcode = SQLFetch(hstmt); 
      } 
   }; 
   SQLFreeStmt(hstmt,SQL_DROP);
}




Это сообщение отредактировал(а) Kirow - 11.10.2011, 21:19
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

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

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


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

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


 




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


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

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