Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];

Вниз

Как получить количество таблиц в БД Access через ADO подключение?   Найти похожие ветки 

 
dalamar   (2004-01-04 00:29) [0]

Господа, помогите со следующей задачей:
Имеется ADO подключение к БД Access. Мне необходимо для работы с данными, прежде всего получить количество и имена таблиц в БД. Их там у заказчика примерно 200 сейчас... и количество будет расти.
Все таблицы состоят из одинаковых полей, но содержат различные данные. Каждая таблица идентифицирована названием клиента, торгующего услугами.
Мне в итоге нужно получить ответ на запрос (поиск по коду услуги, по всем таблицам в БД.
Если у кого есть свежие мысли на счет, как лучше реализовать поставленную задачу, то пишите в форум или на pikulik@mail.ru
Спасибо за все ответы!


 
sniknik   (2004-01-04 01:09) [1]

SL: TStrings

ADOConnection1.GetTableNames(SL, False);
SL.Count <- количество

> поиск по коду услуги, по всем таблицам в БД.
составной запрос с union, типа
SELECT 1 as TableNum, FindField FROM Table1 WHERE Условие поиска
UNION ALL
SELECT 2, FindField FROM Table2 WHERE Условие поиска
UNION ALL
....

TableNum будет идентификатор где нашли в какой таблице, весь запрос естественно формировать динамически


 
dalamar   (2004-01-05 07:46) [2]

Спасибо за квалифицированный ответ!
Ваш ответ мне очень помог, и я даже стал ликовать как все просто.
Но... (ох уж это НО) предложение UNION хорошо справилось с задачей при
небольшом (16) количестве таблиц. А вот в "боевых" условиях, при 200
таблицах, получил ошибку "слишком сложный запрос".
Сейчас подумываю об использовании нескольких потоков для создания
запросов к таблицам.
Если есть предложения по теме, я с благодарностью их приму.
Спасибо.


 
sniknik   (2004-01-05 08:18) [3]

обнови jet/ADO/базу, может не 200 но точно не 16 юнионов должно держать (проверил на 22х, явно больше 16).
если ограничение останется (придется через дополнительную временную таблицу делать так примерно)
SELECT * INTO TempTable FROM (
SELECT 1 as TableNum, FindField FROM Table1 WHERE Условие поиска
UNION ALL
SELECT 2, FindField FROM Table2 WHERE Условие поиска
UNION ALL
...
)
и далее
INSERT * INTO TempTable FROM (
....
)
а после ее прочитать.
в несколько потоков помоему бессмысленно, лутше на асинхронное выполнение запустить он(ADO) их сам создаст (потоки), но не стоит увлекатся большое количество обрашений к одной базе одновременно только замедлит обшее выполнение запросов. нужно тестить как быстрее будет.


 
sniknik   (2004-01-05 08:36) [4]

посмотрел хелп, на количество UNION-нов ограничений нет (не пишут?).
проверь получаемый запрос, руками подобное составь... возможно не от этого.
по хелпу

Слишком сложный запрос. (Ошибка 3360)
Слишком сложный запрос. Необходимо уменьшить количество полей в предложении SELECT или количество подчиненных запросов или таблиц в объединении.
-----------------------------------
подчиненный запрос
Инструкция SELECT, вложенная в инструкцию SELECT, SELECT...INTO, INSERT...INTO, DELETE, или UPDATE или в другой подчиненный запрос.
-----------------------------------
объединение
Операция с базой данных, которая позволяет объединить некоторые или все записи из двух или более таблиц, например, симметричное объединение, внутреннее объединение, внешнее объединение или самообъединение. Обычно объединением называют связь поля одной таблицы с полем такого же типа данных из другой таблицы. Объединение задается с помощью инструкции SQL.

Чтобы задать отношение между двумя таблицами, нужно создать их объединение, указав поля главной таблицы и внешней таблицы с ключом. При добавлении таблицы в запрос нужно создать объединение между соответствующими полями инструкции SQL, определяющей запрос.


 
sniknik   (2004-01-05 10:35) [5]

дошло до меня :о)). (позно правда дома уже комп выключил, пишу уже с работы)

есть какоето ограничение на размер запроса 2000 символов, вроде того. количество юнионов действительно ни при чем.
попробуй както подсократить запросы (хотя все одно на 200 таблиц не влезет, по 10 символов на запрос, смешно :)
ну чтож изворачивайся... ;о))


 
Erik   (2004-01-05 12:22) [6]

А еще можно все данные в одну таблицу засунуть + дополнительное поле KlientID.


 
paul_k   (2004-01-05 12:41) [7]

а ещё есть системные таблицы, однако


 
BlackTiger   (2004-01-05 17:15) [8]

Начнем с того, что отрываем руки пректировщику базы. Потом стучим ему в голову чем-нить тяжелым. Таблица должна быть одна! Если пректировщик думал, что, типа, так быстрее будет, то он далеко не прав.

Теперь же нужно собирать все данный в одну таблицу, как сказал Erik. "SELECT INTO" тебе в помощь.


 
Johnmen   (2004-01-05 17:23) [9]

>BlackTiger © (05.01.04 17:15)

А может быть это а-ля репликация ? :)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
3-2042
SnapIn
2004-01-05 05:14
2004.02.02
Работа с FoxPro (поиск по полю типа Date)


3-1972
Петр
2004-01-09 10:13
2004.02.02
Ошибка с ADOQuery


4-2424
chi
2003-11-20 19:56
2004.02.02
HDC


14-2338
race1
2004-01-10 18:12
2004.02.02
длинныое имя файла


1-2159
Крутыш
2004-01-21 14:41
2004.02.02
Копирование модуля в одном проекте.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский