Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ADO: Запрос возвращает только часть записей / 8 сообщений из 8, страница 1 из 1
28.11.2019, 13:58
    #39895605
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
Поиском не нашёл. Подозреваю, какая-то детская проблема.

- Использую С++ и ADO для работы с Oracle
- Есть таблица с 1 млн записей.
- Использую _RecorodsetPtr + Open, примерно так:
Код: plaintext
1.
rs.Open("select a1, a2, a3, a4, a5 from T order by a1", ActiveConnection, adOpenStatic, adLockReadOnly, adCmdText | adAsyncFetch)


(пробовал по-разному, в т.ч. через _CommandPtr::Execute)

- Запрос выполняется быстро, после чего тяну записи через
Код: plaintext
1.
2.
3.
4.
5.
6.
rs.MoveFirst()
while (!(rs.EndOfFile))
{
    // …
    rs.MoveNext();
}



ошибок не возникает, но число записей гораздо меньше, чем в базе. Цикл завершается по EndOfFile

если уменьшаю число колонок в запросе, число записей на выходе растёт. Т.е. чувствуется какое-то ограничение на полный объём данных. Но где оно устанавливается?

Тот же Oracle SQL Developer этот запрос отрабатывает нормально и возвращает все записи. Работает он, я так понимаю, через jdbc?
...
Рейтинг: 0 / 0
28.11.2019, 14:41
    #39895654
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
1) С первого же взгляда, нафига курсор adOpenStatic
что бы было?
чем стандартный adOpenForwardOnly не удовлетворяет

2) Если что то не работает, самое первое дело попробывать на стандартных (дефолтных) настройках. Т.е. без всяких adOpenStatic, adAsyncFetch и прочей порнографии

p.s.
первый же поиск по гугле находит:
Указывает, что оставшиеся строки после начальной количество указанных в CacheSize асинхронно нужно извлечь свойство.
подозреваю, что Вы как-то не корректно работается с курсором adAsyncFetch и с ним нужно работать как-то по особенному (асинхронно?))) )
...
Рейтинг: 0 / 0
28.11.2019, 14:42
    #39895658
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
p.p.s.
сталкивался с тем. что "стандартный" MS драйвер не все фичи Oracle корректно поддерживал. Сталкивался на blob'ах. Приходилось ставить Oracle драйвера (ODBC и пр.)
...
Рейтинг: 0 / 0
28.11.2019, 14:48
    #39895668
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
p.p.p.s.
"Давайте я почитаю документацию за Вас" ( C )
https://books.google.ru/books?id=VjtvaDlEIF0C&pg=PA128&lpg=PA128&dq=ADO RecordSet EndOfFile adAsyncFetch&source=bl&ots=xrasD-sB2g&sig=ACfU3U1ZfCchsVM7N1YzRrcbfyxgBT7mWw&hl=ru&sa=X&ved=2ahUKEwibqseY6ozmAhXBtYsKHX_fA94Q6AEwDnoECAkQAQ#v=onepage&q=ADO RecordSet EndOfFile adAsyncFetch&f=false
p.p.p.p.s.
деньги на пиво переводить на счет крафт-бара ТвинПикс. Санкт-Петербург, Лиговский пр. 9.31
...
Рейтинг: 0 / 0
28.11.2019, 20:12
    #39895926
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
Leonid Kudryavtsev
1) С первого же взгляда, нафига курсор adOpenStatic
что бы было?
чем стандартный adOpenForwardOnly не удовлетворяет
Чтобы ходить туда-сюда. Сначала была идея через adOpenForwardOnly выгрести все данные в свои структуры. Потом, когда я не понял почему у меня MoveNext так долго работает, я решил сделать "привязку" в ListView напрямую к рекордсету. Потом уже спустя много лет я понял, что проблема не в MoveNext, но adOpenStatic так и оставил, так как скорость особо не поменялась.

Leonid Kudryavtsev
самое первое дело попробывать на стандартных (дефолтных) настройках. Т.е. без всяких adOpenStatic, adAsyncFetch и прочей порнографии
Собственно, в начале так и было, я вообще не пользовался Open-ом, а использовал Command и Execute, у них эти все настройки выставить нельзя. Но, видимо, мне не повезло
, в начале экспериментов над далёкой большой таблицей, у меня не было счётчика строк, я, видимо, просто не дождался момента, когда все строки загрузились. Завтра с утра на работе всё верну назад и буду пробовать дефолтный вариант.

Leonid Kudryavtsev
подозреваю, что Вы как-то не корректно работается с курсором adAsyncFetch и с ним нужно работать как-то по особенному (асинхронно?))) )
Да финн знает, вроде как обычно MoveFirst -> { MoveNext } а как с ним можно необычно работать?

Leonid Kudryavtsev
сталкивался с тем. что "стандартный" MS драйвер не все фичи Oracle корректно поддерживал. Сталкивался на blob'ах. Приходилось ставить Oracle драйвера (ODBC и пр.)
У меня оракловый провайдер.

Leonid Kudryavtsev
деньги на пиво переводить на счет крафт-бара ТвинПикс. Санкт-Петербург, Лиговский пр. 9.31
Это очень хорошая идея, если есть номер карты/телефон, я бы перевёл денег на пиво, люди должны получать радость за свои скиллы, тем более завтра пятница
...
Рейтинг: 0 / 0
29.11.2019, 06:16
    #39896026
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
Что-то не помогло :(

Пробовал так:
Код: plaintext
1.
rs.Open ("select ...", ActiveConnection, adOpenForvardOnly, adLockUnspecified, adOptionUnspecified);


и так:
Код: plaintext
1.
cn.Execute ("select ...", nullptr, adCmdUnknown);


где cn - _ConnectionPtr, который
Код: plaintext
1.
cn.Open(connString, user, pswd, -1);
...
Рейтинг: 0 / 0
29.11.2019, 15:01
    #39896436
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
Делать тестовый пример (простейший .C который просто подсчитывает результат + скрипт на создание данных).

IMHO Странно это.
Не верю я, что ADO настолько кривой ))) ==> где-то ошибка в коде.
...
Рейтинг: 0 / 0
17.01.2020, 09:31
    #39915188
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO: Запрос возвращает только часть записей
Похоже, проблема была в том, что из-за огромной выборки приложению не хватает памяти. При этом ADO перестаёт тянуть данные, не сообщая об ошибке. Это в случае adOpenForwardOnly. Просто на очередной записи говорит eof и всё. А вот в случае CursorLocation = adUseServer, оно падает, всё ок.

И вот интересно, по идее, adOpenForwardOnly - это получение 1 записи за 1 раз? Если так, то почему по мере MoveNext использование памяти в приложении нарастает? Или я опять что-то не так делаю?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ADO: Запрос возвращает только часть записей / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]