Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > [C++ Builder 2006] Получение структуры БД Access


Автор: CyberBullDog 11.6.2007, 14:46
Доброго времени суток.

Проблема в том, что структура Access-ной БД заранее не известна.
Имена таблиц из БД получаю так:
Код

ADOConnection1->GetTableNames( ComboBox1->Items, false );

Он вместе с таблицами выдает и имена запросов. Можно ли их как-то разграничить?

Заодно еще такой вопрос.
Имена полей таблицы получаю так:
Код

ADOTable1->GetFieldNames( ComboBox2->Items );

уже при работе программы возникает ошибка "Could not convert variant of type (Null) into type (String)", try ... catch ее не ловит, имена полей успешно записываются в ComboBox. С этим можно что-то сделать?

Автор: Rodman 11.6.2007, 15:18
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=123454&hl=ado,and,tstringlist глянь... какое там продолжение!!!

Автор: CyberBullDog 12.6.2007, 11:59
Это конечно интересно, только вот в Access-е я ничего похожего не нашел.
Да чего там говорить, если в Access оператор select не знает что такое limit.

SELECT Statement (Microsoft Access SQL):
SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, …]]}     FROM tableexpression [, …] [IN externaldatabase]     [WHERE… ]     [GROUP BY… ]     [HAVING… ]     [ORDER BY… ]     [WITH OWNERACCESS OPTION]

(Источник: http://msdn2.microsoft.com/en-us/library/Bb208930.aspx)

Автор: Rodman 12.6.2007, 12:04
Цитата(CyberBullDog @  12.6.2007,  10:59 Найти цитируемый пост)
Access оператор select не знает что такое limit.

он знает TOP!

Автор: CyberBullDog 14.6.2007, 15:17
За TOP спасибо, буду знать.

Кто-нибудь знает как пользоваться ADOX?

Импортировал Microsoft ADO Ext. 2.8 for DDL and Security, прикрутил полученные файлы (ADOX_TLB) к проекту.
Что делать дальше не знаю. Примеры, которые видел, не прокатывают.

Вот один из таких примеров (на Delphi):
http://entwickler-forum.de/archive/index.php/t-10974.html

Автор: Rodman 14.6.2007, 15:25
что конкретно
Цитата(CyberBullDog @  14.6.2007,  14:17 Найти цитируемый пост)
не прокатывают

???

ты компонент нормально поставил?!

Автор: CyberBullDog 14.6.2007, 16:08
Ставил так:
Component->Import Component...
Выбираю Import a Type Library,
дальше ADOX (MS ADO Ext. ...),
на след. странице оставляю как есть,
выбираю Add Unit to 'Myproject'

Пытаюсь уже не открыть готовую базу, а создать новую (все примеры почему-то направлены на это).
Последний раз пробовал так:
Код

CatalogPtr Cat;
WideString CS;
Cat = CreateComObject(Sysutils::StringToGUID("ADOX.Catalog"));
Cat->Create(CS.c_bstr());


Может я уже путаю два разных подхода. В итоге вылезает сообщение: "Интерфейс не поддерживается [Да][Нет][Отмена]".

Было бы не плохо увидеть пример, если таковой есть.

Автор: CyberBullDog 18.6.2007, 10:36
Строка коннекта из UDL-файла не подходит.
Получилось создать базу с  такой строкой коннекта:
Код

CS = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DBPath+";Jet OLEDB:Engine Type=4";

А вот как подключиться к уже существующей базе?

Автор: CyberBullDog 20.6.2007, 10:23
В Delphi все получается, а в Builder-е что-то никак.
Буду писать на Delphi. smile 

Автор: mutex 23.6.2007, 22:29
CyberBullDog
Не надо заморачиваться с ADOX. Используйте обычные ADO-компоненты и метод TADOConnection->OpenSchema.

Схематически алгоритм выглядит так:

AdoLoadSchema("TABLE", ListBox1); //таблицы
AdoLoadSchema("VIEW", ListBox2);  //виды (запросы)

void TForm1::AdoLoadSchema(AnsiString FilterValue, TListBox *ListBox)
{
  int Bounds[2] = {0,3};
  OleVariant Filter = VarArrayCreate(Bounds, 1, varVariant);
  ListBox->Clear();
  Filter.PutElement(FilterValue, 3);
  TADODataSet *ADOTmp = new TADODataSet(NULL);
  try
  {
    ADOConnection1->OpenSchema(siTables, Filter, EmptyParam, ADOTmp);
    while (!ADOTmp->Eof)
    {
      if (AnsiSameText(FilterValue, ADOTmp->FieldByName("TABLE_TYPE")->AsString))
        ListBox->Items->Add(ADOTmp->FieldByName("TABLE_NAME")->AsString);
      ADOTmp->Next();
    }
  }
  __finally
  {
    delete ADOTmp;
  }
}

Тестовый проект на 6-м Билдере см. в TestMDB.zip

Автор: CyberBullDog 25.6.2007, 12:10
mutex, спасибо!
Обязательно попробую. smile 

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