Источник www.vindexexpo.com.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как организовать поиск в БД используя Seek
Oleg_k
Отправлено: 31.08.2004, 19:40


Не зарегистрирован







Народ, помогите разобраться! Как организовать поиск в БД используя метод Seek компонента ADOTable (база Access)! В исходной таблице есть составной индекс из 4 столбцов. Что это за тип такой -Variant?
Заранее благодарен!
olegenty
Отправлено: 01.09.2004, 08:02


Ветеран

Группа: Модератор
Сообщений: 2412



1. не задавай в форуме пахабных вопросов типа
QUOTE

Что это за тип такой -Variant?

поскольку его описание есть
1.1. в Help
1.2. в сорцах
хоть обчитайся

2. а верна ли постановка задачи??? почему не TADOQuery c уточнением, а именно Seek по (о ужас!!! ohmy.gif ) TADOTable? ты точно уверен, что на таблице в несколько сотен тысяч Seek — верное решение???

да, ну а если всё так, то ораганизуй поиск, как написано в справке. там всё приподробненько описано. английским по цвету clWindow smile.gif
Guest
Отправлено: 01.09.2004, 19:34


Не зарегистрирован







QUOTE (olegenty @ 01/09/2004, 09:04)
ты точно уверен, что на таблице в несколько сотен тысяч Seek — верное решение???

Нет не уверен! Если бы был уверен вопросы бы не задавал! Подскажи, пожалуйста, как правильно организовать поиск по ключевому полю в базе Access97!
А с типом Variant справка мне не очень помогла — толи мой Eng хромает толи опыта еще мало в програмировании, потому и обратился за помощью!
Буду благодарен за любой совет!
Guest
Отправлено: 01.09.2004, 19:39


Не зарегистрирован







QUOTE (olegenty @ 01/09/2004, 09:04)
ты точно уверен, что на таблице в несколько сотен тысяч Seek — верное решение???

Нет не уверен! Если бы был уверен вопросы бы не задавал! Подскажи, пожалуйста, как правильно организовать поиск по ключевому полю в базе Access97!
А с типом Variant справка мне не очень помогла — толи мой Eng хромает толи опыта еще мало в програмировании, потому и обратился за помощью!
Буду благодарен за любой совет!
P.S. А в справке так и написано английским по clWindow — используйте Seek для поиска в поле содержащем индекс!
AVC
Отправлено: 02.09.2004, 08:14


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

QUOTE
(olegenty @ 01/09/2004, 09:04)
ты точно уверен, что на таблице в несколько сотен тысяч Seek — верное решение???

Нет не уверен! Если бы был уверен вопросы бы не задавал!

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

Variant, грубо говоря, это тип, способный правильно хранить и преобразовывать значения большинства других базовых типов данных. В первом приближении напоминает union (как это и было в ранних реализациях) теперь com класс. Список методов можно получить в Help'е.
Guest
Отправлено: 02.09.2004, 20:15


Не зарегистрирован







На счет запроса я с Вами полностью согласен — если мы хотим найти (отобрать) n -ое количество записей, которые отвечают некоторому условию(- ям)! Но нам нужна всеголишь 1 запись, которую нам нужно найти ! И я думаю, что запрос сдесь ничем не выигрывает перед Seek, темболее Seek — ето метод, специально предназначенный для поиска по ИНДЕКСУ, т.е. просмотра всей таблицы не будет!!! Поправте меня если я не прав!

На счет типа VARIANT — теоретически я понимаю что представляет собой этот тип (справку я читаю как это ни странно), но практически при его использовании в методе SeeK поиска не происходит. Поетому я предполагаю, что я не совсем понимаю как его правильно использовать!
Если можно помогите КОНКРЕТНЫМ ПРИМЕРОМ!
AVC
Отправлено: 03.09.2004, 08:28


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
И я думаю, что запрос сдесь ничем не выигрывает перед Seek, темболее Seek — ето метод, специально предназначенный для поиска по ИНДЕКСУ, т.е. просмотра всей таблицы не будет!!! Поправте меня если я не прав!

Так и есть для СУБД типа dbase где ваше приложение прикидывается сервером и управляет базой на физическом уровне.
Но вы абсолютно не правы если работаете с SQLевской базой. При выполнении запроса формируется (открывается) так называемый курсор, который можно рассматривать как временную таблицу. Физическое управление этим курсором лежит на сервере. При Seek'е (Locate) данные обязательно извлекаются из курсора для сравнения. Т.е. если мощность выборки составляет 200 000 записей и мы хотим найти последнюю то придется извлечь 199 999 не нужных записей. Поэтому запрос вида
Select * From ttt Where key_field = key_value
для получения одной записи несомненно выгоднее.
Кстати, я уже упоминал, что наличие/отсутствие ключевых полей или индексов ни как не сказывается на возможности выполнения запроса, а только на скорости выполнения.

По вариантам пример:
QryMain->Locate(FQryMain_PKName, oldcode, TLocateOptions());
позиционирует DataSet по ключевому полю на нужную запись
Guest
Отправлено: 03.09.2004, 16:11


Не зарегистрирован







Обясните мне, прожалуйста, зачем тогда разработчие включил в ADO такой "непроизводительный" метод Seek. НЕ в одном источнике, которыми я пользовался, не говорилось — используйте запрос для более эфективного поиска. А четко сказано используйте  — SEEK! Или вы хотите сказать он создан для неопытных програмистов, типа Меня , чтобы не усложнять им жизнь!
Если Вы можете, то дайте пожалуйста, пару сылок, где я могу в целях повышения образованости, узнать о способах организации БД и методах повышения эффективности работы с ними! cool.gif
AVC
Отправлено: 03.09.2004, 17:17


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Обясните мне, прожалуйста, зачем тогда разработчие включил в ADO такой "непроизводительный" метод Seek.

ADO может поддерживать связь с разнообразными источниками данных, в том числе и с теми где метод Seek будет оправдан. Мы же речь ведем о SQL'евских базах в которых ответственность за физическое расположение данных и способах доступа к ним лежит на сервере. Т.е. если вы даже используете компонент таблица на самом деле вы неявно работаете с запросом вида Selec * From Table так как сервер ни кому не позволит работать напрямую с физической таблицей. Поэтому для поиска выгоднее использовать запрос.
Из примечания в моем Help'е следует что метод Seek "is only supported for use with Microsoft Access2000 and the Jet 4 provider" с кучей дополнительных ограничений. Я же пытался вам рассказать про "общий случай" поиска записей в SQL'евских базах.

QUOTE
... узнать о способах организации БД и методах повышения эффективности работы с ними!

Зависит от используемой СУБД. Например Том Кайт "Oracle для профессионалов"
Несколько общих советов (в SQL'евских базах)
Везде где можно использовать Select.
Select работает быстрее цикла.
Лучше использовать Select чем функцию.
В Selecte ограничивать объем выборки как можно раньше.
Лучше обходиться без Having
Guest
Отправлено: 03.09.2004, 17:32


Не зарегистрирован







Спасибо за совет! Попробую запросы!

А до оракла мне еще далико — тут бы с access ' ом разобраться!

А Вы работаете с ораклом, как я понял их контекста?

В каких слкчаях он предпочтительней Access на Ваш взгляд?

А Вы не можете посоветоваь ссылки в инет на инфу о
работе с БД? А то с книгами прблемы — вечно нет тех что надо!
AVC
Отправлено: 06.09.2004, 09:39


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
А до оракла мне еще далико — тут бы с access ' ом разобраться!

Если вы знаете принципы SQL то работать можно практически с любым сервером (не путайте с администрированием). Простые запросы выполняются везде. Для остальных достаточно уточнить синтаксис и ограничения.
QUOTE

А Вы работаете с ораклом, как я понял их контекста
В каких слкчаях он предпочтительней Access на Ваш взгляд?

И с ним в том числе. СУБД выбирается в первую очередь в зависимости от поставленной задачи и финансовых возможностей заказчика если требуется лицензирование. Для себя я делю СУБД на 3 класса
1. Большие (Oracle, MSSql, Sybase ...) для случая, когда много таблиц сложной организации с большим объемом информации, а время ответа должно быть не большим.
2. Средние (ASA, MaxDB, Interbase ...) для решения задач небольшиго предприятия (одновременная работа до 10-ти станций).
3. Карманные (не SQLевские) (dbase, Paradox ...) для хранения данных локального приложения или для обмена данными между приложениями, работающими с классами 1 и 2.
Access я не включил в список намеренно. Считаю, что его место на грани 3 — 2 и, кроме того, у него есть собственные средства разработки приложения.
(Но все это мое личное мнение)

QUOTE

А Вы не можете посоветоваь ссылки в инет на инфу о
работе с БД? А то с книгами прблемы — вечно нет тех что надо!

Нет. Предпочитаю "живые" книги. Поищете, например, на Google — такой информации должно быть море.
Guest
Отправлено: 06.09.2004, 18:50


Не зарегистрирован







Я в Вашем списке не увидел Акцес, или он скрывается под ASA?
И еще, один вопрос, если можно: как вставлять новые записи — тоже c помощю запросов или всетаки можно использовать банальный Insert!
Большое спасибо!
AVC
Отправлено: 07.09.2004, 08:20


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Я в Вашем списке не увидел Акцес

Поищите по слову Access (подсказка: после пункта 3)

QUOTE
как вставлять новые записи — тоже c помощю запросов или всетаки можно использовать банальный Insert!

Смотрите мой пост от 03/09/2004, 17:19 — Везде где можно использовать Select.
Можно все что разрешено. Вопрос эффективности решается для каждой конкретной СУБД отдельно. На SQL'евских базах "банальный Insert" (метод TTable — я правильно понял?) транслируется в банальный запрос Insert into. Выводы делайте сами smile.gif .
Судя по вашим вопросам вы привыкли работать с СУБД класса dbase/paradox где оперируемой единицей информации является запись (строка, кортеж ...). В SQL оперируемой единицей является таблица (выборка, курсор, запрос ...) (не путать с таблицей хранения данных) и все операции SQL надо рассматривать в этом аспекте. Т.е., по поводу Insert, конструкция Insert into table Select * from other_table вставляет сразу много строк из other_table в table и выполняется сервером, который может использовать свои возможности наиболее эффективно.
Guest
Отправлено: 07.09.2004, 22:03


Не зарегистрирован







Данкишон!

Как я не заметил про Аccess не знаю! После работы внимание на нуле!

Я, наверно Вас достал, но всетаки, не сочтите за труд: если запрос вернул n запесей, которые не были ни как не упорядочены, они будут расположены в порядке их добавления в базу или как бог даст?
(База Ассess)
AVC
Отправлено: 08.09.2004, 08:06


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
если запрос вернул n запесей, которые не были ни как не упорядочены, они будут расположены в порядке их добавления в базу или как бог даст?

Как бог даст. Если это не так, то вам на этот раз просто повезло. В SQL принято, что при отсутствии Order by порядок произвольный.
Guest
Отправлено: 08.09.2004, 23:35


Не зарегистрирован







Есть несколько реплик 1 базы (акцес)! Почему я не могу получить доступ к репли ке через ADO! Выдает ошибку! Хотя когда база не является репликой все работает отлично! Спасибо!
Nick
Отправлено: 09.09.2004, 08:45


Машинист паровоза

Группа: Участник
Сообщений: 247



С базами Access лучше работать его же средствами.
В последствии даже .exe сделать.

Если хочешь писать в BCB выбери другую базу.
1. Для простенькой локальной задачи DBase, Paradox, IBase (FireBird) на крайняк.
2. Для небольшой сетевой IBase (FireBird).
3. Для крупной задачи Oracul, MS SQL.

Это конечно мое мнение.

Работал с Paradox в DOS (проблемы при сбое питания),
работал в Win с Access (в сети более 5 комп тормоза).
Счас работаю FireBird — очень большая разница.

AVC
Отправлено: 09.09.2004, 08:45


Ветеран

Группа: Модератор
Сообщений: 1583



И Access и ADO детище Microsoft — вопрос к ним.
AVC
Отправлено: 09.09.2004, 08:55


Ветеран

Группа: Модератор
Сообщений: 1583



2 Nick абсолютно с вами согласен (см. мой пост от 06/09/2004, 09:41)
(а если вы поработете еще например с MaxDB или ASA разница станет еще более ощутимой)

Guest — если еще не поздно замените Access на любой сервер из группы 2. Если вас смущает финансовый вопрос — они либо бесплатные, либо не очень дорогие.

Отредактировано AVC — 09/09/2004, 08:59
Guest
Отправлено: 09.09.2004, 21:03


Не зарегистрирован







А они поддержуют репликацию?
Nick
Отправлено: 10.09.2004, 08:02


Машинист паровоза

Группа: Участник
Сообщений: 247



2 AVC
MaxDB или ASA

что в них вкусненького

переходя с Access на FireBird
я восторгался триггерами и хранимыми процедурами
и UDF немного
и транзакциями конечно, хотя в Access они тоже есть,
но об этом я узнал только когда уже делал проект в BCB
AVC
Отправлено: 10.09.2004, 09:09


Ветеран

Группа: Модератор
Сообщений: 1583



Guest — ASA — да. Остальные — не интересовался.

Nik
Наличие триггеров, SP, conctraint'ов и транзакций даже не оговаривается. Это просто обязано быть.
Например ASA очень последовательно подходит выборкам: результат любой выборки это виртуальная таблица с которй можно делать на следующем уровне все, что разрешено для таблиц. И так до бесконечности. Например update на ASA можно написать такой, который даже Oracl'у не снился.
Или еще маленькие удобства — в сессии можно объявлять хранимые на сервере переменные (в стиле Clipper private) на время жизни сессии и использовать их в запросах. Переменная может быть таблицей, с которой можно работать как с обычной таблицей. Это в совокупности с допустимостью множества SQL команд в одном запросе позволяет организовать "конвейерное" выполнение запросов.
Да, конечно, всего этого можно добиться при помощи View и SP. Но, согласитесь, приятнее когда это просто текст без дополнительных телодвижений типа Create и Drop.

У IB (не знаю как у FB) был один очень существенный недостаток (может, конечно, я не до конца разобрался с назначением прав). Права доступа применялись не для базы данных а для сервера. Т.е. берешь закрытую базу (физ.файлы) цепляешь её не другой сервер — и, опаньки, видишь всю информацию. При разработке коммерческого приложения очень сложно объяснить клиенту почему конкуренты (или налоговая) могут очень легко увидеть их данные. Сервера, которые я привел в примерах защищают именно базу. Пока не введешь правильную парочку пользователь/пароль тебе ни кто не поможет.
Nick
Отправлено: 11.09.2004, 08:28


Машинист паровоза

Группа: Участник
Сообщений: 247



2 Guest
в FireBird нет репликации,
сделал лерез лог таблицу которая заполняется
тригерами на изменение, тем более что в филиалах не нужна полная информация, а только документы относ к этому филиалу а справочники полность реплицируются.

2 AVC
Да именнованных констант не хватает
другие вещи можно сделать View и SP.

в версии FB 2 обещали исправить защиту.
мне тоже это не нравится.

ASA — чья разработка и какие драйвера и компоненты нужны ?


AVC
Отправлено: 13.09.2004, 09:20


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

ASA — чья разработка и какие драйвера и компоненты нужны ?

ASA это Adaptive Server Anywhere. Разработка Sybase. Имеет большинство возможностей "большого" Sybase. Ставится на все, начиная с Win3x. Драйвера ставит сам. Доступ через ODBC (ADO/BDE) (может уже есть "прямые" компоненты).
QUOTE

другие вещи можно сделать View и SP.

Недавно здесь же была полемика на эту тему. Я остался при своем мнении и позволю повториться:
... всего этого можно добиться при помощи View и SP. Но, согласитесь, приятнее когда это просто текст без дополнительных телодвижений типа Create и Drop.
Кроме того этот текст можно хранить как поле некой служебной таблицы и вносить изменения только в него (не требуется перекомпиляция, линковка и распространение обновленных версий, создание view и sp, расстановка прав ...)
Guest
Отправлено: 13.09.2004, 23:26


Не зарегистрирован







Что такое тригеры? И для чего они применяются!
AVC
Отправлено: 14.09.2004, 08:41


Ветеран

Группа: Модератор
Сообщений: 1583



Уважаемый гость, достаньте и прочтите учебник по SQL с примерами реализации на каком либо сервере. Не хочется излагать здесь учебный курс.
Триггер — это SP запускаемая при наступлении определенного события. Применяются для выполнения нужных действий при наступлении данного события (например тонкая проверка целостности БД или каскадное обновление).
olegenty
Отправлено: 20.09.2004, 10:49


Ветеран

Группа: Модератор
Сообщений: 2412



Приношу извинения за неответ — был в отпуске. Присоединяюсь к тому, что сказали AVC и Nick. Особенно по поводу того, что для начала тебе невредно просто отвернуться от компа и почитать литературы по
1. стандарту синтаксиса SQL
2. нескольких серверах БД в целом
3. расширения синтаксисов SQL на серверах

затем определиться с решаемой задачей, и выбрать конкретную СУБД. не Access, потому что рано или поздно твой уровень дорастёт до того, что ты осознаешь и будешь вынужден перенести свой проект на другой сервер SQL (если это не телефонный справочник и предполагает работу в сети)

основной недостаток Access — отсутствие хранимых процедур и триггеров, которые и делают львиную долю всей работы (в противном случае уйма правил работы с данными (или бизнес-правил, или бизнес-логики, называй, как удобней) лягут на сторону клиента. например, при вставке записи в одну таблицу модифицируются данные других таблиц. в случае SQL базы, это реализуется в триггере, и всю работу делает сервер. в случае Access, ты будешь вынужден все управляющие модификацией данных других таблиц запросы делать из своего клиентского приложения. если сделать это грамотно, то лишних фетчей-то можно избежать, но любая модификация правил работы с данными ВСЕГДА повлечет изменение модифицирующего скрипта и перекомпиляцию исходника — это минимум, если ты скрипты модификации параметрически куда-то грамотно вынесешь (в свой компонент ли, или ещё куда-то), или ещё и дописывание/модификацию нового кода, если завяжешься на "тупое" процедурное событийное программирование).
olegenty
Отправлено: 20.09.2004, 11:04


Ветеран

Группа: Модератор
Сообщений: 2412



стоп, насчёт "ВСЕГДА ... перекомпиляцию ... " я погорячился, можно и без перекомпиляции обойтись, просто договориться с собой самим о правилах генерации скрипта. но это будет уйма дополнительной работы по изобретению велосипеда и привязка к жестким правилам, любой отход от которых приведёт к нарушению функциональности.

Вернуться в Работа с базами данных в C++Builder