Помогите выбрать, ADO или DAO

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Помогите выбрать, ADO или DAO

Сообщение alibek » 15.01.2004 (Чт) 10:00

Привет, All.
Вот такой небольший вопросец. Есть серверное приложение, подключает клиентов, принимает от них запросы, делает выборку в базе данных (асинхронно) и возвращает ответы.
И не знаю, какой метод лучше выбрать. С одной стороны ADO лучше, и с асинхронностью в нем попроще, и метод более продвинутый, и проще будет на другую платформу переходить. Но с другой, не поддерживаются индексы, а мне очень важен быстрый поиск в таблице.
А в DAO есть замечательный метод .Seek, но есть и минусы. И самый главный минус -- постоянно объявляются какие-то баги и непонятки с составными индексами.
Собственно хотелось бы услышать рекомендации.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.01.2004 (Пт) 14:22

Ап! :)
Вообщем решил я все-таки на ADO. Тем паче, что в DAO индексы поддерживаются только в Microsoft Jet, а асинхронные запросы только в ODBC Workspace.
Но никак не могу найти провайдера, который бы поддерживал индексы в ADO. Во всех основных таблицах есть ключевое поле (Long), есть уникальный индекс по этому полу. И все это только для того, чтобы поиск записи был максимально быстрым. И теперь никак не могу ничего придумать, чтобы использовать эти индексы. А Find (который вдобавок и искать умеет только по одному полю) это слишком медленно.
Lasciate ogni speranza, voi ch'entrate.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.01.2004 (Пт) 17:30

Ох, не знаю, поможет ли тебе что-нибудь... Потому что, похоже, тут ты самый осведомленный в вопросе товарищ. :wink: Но информацией, пожалуй, все-таки поделюсь. Вдруг, пригодится...

1) ADO и DAO. Сразу скажу, всегда использовала ADO. Поэтому и душа к нему лежит. Судя по всяким там MSDN и тд DAO лучше подстроен под Access. Ты-то ведь наверняка MS SQL Server использовать будешь. А тут обычно рекомендуют ADO. В ADO.NET даже отдельные парные классы к обычным появились - SQLConnection, SQLCommand - типа, быстрее и лучше, используя специфику именно SQL Server'a. Так что думаю, что твой выбор правильный
Вот глянь на всякий случай еще на статьи в апрельском (2001) MSDN
"Choosing Your Data Access Strategy"
http://msdn.microsoft.com/library/defau ... nology.asp

"INFO: Issues Migrating from DAO/Jet to ADO/Jet"
http://support.microsoft.com/default.as ... bContent=1

2) По поводу индексов и поиска
смотри метод Seek у рекордсета (это для твоих индексированных полей).
http://support.microsoft.com/default.as ... -US;243465
Хм... а это только для Jet...

Можно строить индекс динамически. Не знаю, сколько времени занимает...
Свойство Optimize у поля Fields(0).Properties("Optimize") = True - построит индекс
После того, как отработал Find его можно удалить
Fields(0).Properties("Optimize") = False

А еще есть вопрос: ведь если ты будешь выполнять хранимые процедуры на сервере, то ведь все твои индексы будут работать? А хранимые процедуры исполнять, используя объект Command и получать нужные рекордсеты... Это правильно, в смысле, не спасет ли это тебя?
Последний раз редактировалось Rainbow 16.01.2004 (Пт) 18:01, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.01.2004 (Пт) 17:58

За последнюю ссылку особенное спасибо :)
Похоже, самое то. Вот только я делал точно так-же, но выскакивала ошибка, что провайдер не поддерживает метод. Видимо где-то ошибся я. Скорее всего здесь:
Also, you can only use the Seek method when a recordset is accessing the table directly. In this example, the recordset is instructed to access the table directly by the adCmdTableDirect argument in the Open method. You cannot use the Seek method on objects such as queries and linked tables.


Перечитал, подумал, самое то! :) Rainbow, ты золото :)

А насчет хранимых процедур -- для этого надо хотя бы на MS SQL Server перебраться, а пока все работает на .mdb-файле
Lasciate ogni speranza, voi ch'entrate.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.01.2004 (Пт) 18:04

alibek писал(а):Перечитал, подумал, самое то! :) Rainbow, ты золото :)

Спасибо :lol: :P

alibek писал(а):А насчет хранимых процедур -- для этого надо хотя бы на MS SQL Server перебраться, а пока все работает на .mdb-файле

Погоди, погоди... А как же Queries? Там же как-то можно параметры задавать. Сейчас пойду вспоминать :)

Ну, да, правильно. В Query любое незнакомое слово воспринимается как параметр. Вот их и можно задавать в параметрах Command.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.01.2004 (Пн) 11:41

Вообщем отчитываюсь :)

Индексы заработали, дело было не только в adCmdTableDirect, но и в том, что базу я создавал еще в DAO и, соответственно, формат БД был старый. А в ней индексы и не работали.

Что же касается параметрических запросов, то помоему это не нужно, я все равно открываю таблицы, используя курсор на стороне сервера.
Lasciate ogni speranza, voi ch'entrate.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 19.01.2004 (Пн) 12:56

alibek писал(а):Индексы заработали, дело было не только в adCmdTableDirect, но и в том, что базу я создавал еще в DAO и, соответственно, формат БД был старый. А в ней индексы и не работали.

Ага, понятно...

alibek писал(а):Что же касается параметрических запросов, то помоему это не нужно, я все равно открываю таблицы, используя курсор на стороне сервера.

Да, пожалуй.
Пока смотрела, нет ли подвохов с серверным курсором (вроде, для Access все ОК), наткнулась на статью опять же про DAO и ADO, где показывают, как выполняются различные операции над рекордсетами в том и другом. В частности, говорится, что для сортировки нужно на клиентской стороне открывать.
http://msdn.microsoft.com/library/defau ... topic5.asp

И еще одна фраза меня удивила. Только это для SQL Server'а.
Server cursors are created only for statements that begin with:

SELECT
EXEC[ute] procedure_name
call procedure_name

Even if an application explicitly requests a server cursor, server cursors are not created for statements such as INSERT.

Почему? Чем это отличается от ситуации, когда другой пользователь со своей коннекцией обновляет данные?

Fox Mulder
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 21.12.2007 (Пт) 14:32
Откуда: г. Кривой Рог, Украина

Сообщение насчет индексов в ADO

Сообщение Fox Mulder » 21.12.2007 (Пт) 14:42

ADO более продвинутая технология во всех случаях. Индексные файлы имеют место. Первый способ, как уже было описано присвоить значению свойства поля ("Optimize") - true для создания индекса, false - для удаления.

Но самый лучший способ - использование метода Sort объекта Recordset - данный метод создает индекс по одному или нескольким полям которые можно указать через запятую.
А Find после Sort (сортировки) - это аналог Seek, он более удобен - так как ищет с текущей записи, или с записи, которая указывается с помощью Bookmark.
Именно синхронизация Sort (создание временных индексов) и Find позволяет решить любую задачу.

ЕСЛИ возникают вопросы при использовании технологии ADO и прочих вещей пишите - ОТВЕЧУ С УДОВОЛЬСТВИЕМ!!!
Все будет классно:)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 21.12.2007 (Пт) 15:34

Какая утонченная некрофилия... :lol:
Ничего, что вопросу уже пять с половиной лет?
Лучший способ понять что-то самому — объяснить это другому.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 24.12.2007 (Пн) 11:59

главное, как удачно выловил Алибека 8)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron