• говно Access VBA В общем в первотеге стандартным внутренним ОРМ для взаимодействия с бд является DAO. Оно в целом уже давно является legacy и в большинстве случаев рекомендуют пользовать ADO. Но именно внутри access DAO оптимизирован просто превосходно и работает местами быстрее ADO (сам не тестировал, но встречал именно такое мнение). Но самый пиздец в нем — это программный доступ к результатам запросов. Нельзя просто отправить запрос на выборку и получить данные. Сперва надо создать объект набора данных Recordset, который по сути является итератором. То есть, пока ты его не прокрутишь до EOF, ты не узнаешь, какое количество результатов вернула бд. Но есть спасительный (вроде как) метод GetRows, который возвращает указанное количество строк результатов в виде двумерного массива.

    И, казалось бы, вот оно — СЧАСТЬЕ! А вот хуй там! Ключевые слова здесь "указанное количество". Если в метод не передавать вообще ничего, то он вернет только текущую строку. Если ввести число меньше длинны результата — получишь не все значения. А если больше — словишь ошибку Out of range. И тут приходит мысль — а почему бы не передать в него длинну самого набора результатов, тем паче, что есть свойство RecordCount. Вот только показывает оно количество прочитанных результатов на данный момент и сразу после запроса равно 1, если результат не нулевой, и дальше растет по мере прокрутки итератора.

    В итоге получаем какой-то невероятно идиотический механизм взаимодействия. Получаешь итератор, крутишь его, а потом с ним работаешь... СТОП! А нахера мне с ним как-то еще работать, если я его УЖЕ прокрутил и при этом у меня есть все возможности параллельно считать все значения построчно?

Replies (7)

  • @CaufMAN, А как надо?
  • @CaufMAN, Не понял про «какое количество результатов вернула бд». Если тебе нужно узнать количество строк в таблице, то есть SELECT COUNt(*) что‐то там.
  • @CaufMAN, не связывайся с вба, ты тратишь время в говно
  • @dsub, Это моя работа. Деваться некуда.
  • @mabu, Мне нужно получить набор строк по перечню полей. НЕикаких агрегатных функций не подразумевается. Получить эту инфу из Recordset крайне геморно.
  • @CaufMAN, Set rst = db.OpenRecordset("qryAlbumsPrm")
    rst.MoveLast

    MsgBox "Recordset created with " & rst.RecordCount & " records."
  • @kitt, Здесь я, кажется, этого не публиковал:

    Если рекордчет имеет в результатах одну запись, то сразу после инициализации он вроде как указывает не на EOF, а на запись. При этом она является First и Last одновременно. А сместиться с First по MoveFirst и с Last по MoveLast нельзя — выкидывает исключение. Можно сместиться инкрементно и попасть на EOF. Но ты никогда не знаешь, не является ли текущая запись последней, пока не шагнешь вперед. То есть фактически методы RecordSet.MoveLast и RecordSet.MoveFirst являются не безопасными в плане выполнения потока программы.