Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Базы данных > [C++ Builder 2006] Получение структуры БД Access |
Автор: CyberBullDog 11.6.2007, 14:46 | ||||
Доброго времени суток. Проблема в том, что структура Access-ной БД заранее не известна. Имена таблиц из БД получаю так:
Он вместе с таблицами выдает и имена запросов. Можно ли их как-то разграничить? Заодно еще такой вопрос. Имена полей таблицы получаю так:
уже при работе программы возникает ошибка "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 |
он знает 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, 16:08 | ||
Ставил так: Component->Import Component... Выбираю Import a Type Library, дальше ADOX (MS ADO Ext. ...), на след. странице оставляю как есть, выбираю Add Unit to 'Myproject' Пытаюсь уже не открыть готовую базу, а создать новую (все примеры почему-то направлены на это). Последний раз пробовал так:
Может я уже путаю два разных подхода. В итоге вылезает сообщение: "Интерфейс не поддерживается [Да][Нет][Отмена]". Было бы не плохо увидеть пример, если таковой есть. |
Автор: CyberBullDog 18.6.2007, 10:36 | ||
Строка коннекта из UDL-файла не подходит. Получилось создать базу с такой строкой коннекта:
А вот как подключиться к уже существующей базе? |
Автор: CyberBullDog 20.6.2007, 10:23 |
В Delphi все получается, а в Builder-е что-то никак. Буду писать на Delphi. ![]() |
Автор: 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, спасибо! Обязательно попробую. ![]() |