powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Узнать количество строк в Recordset-е
22 сообщений из 22, страница 1 из 1
Узнать количество строк в Recordset-е
    #39872723
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
из VBA в MS Access подключаюсь к таблице на сервере MySql
Создаю рекордсет: Dim rst as New ADODB.Recordset
Я был удивлён, что не могу получить количество строк даже после использования rst.movelast
Я даже пробовал rst.getRows, но я не знаю, для чего это. Так как оно мне ничего не даёт.
Вот, что у меня показывает (смотрите скрин)
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39872749
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрашивай количество записей отдельным запросом. Если оно нужно именно как самостоятельные данные.

Иначе - итерируешь, проверяешь на конец, нет - следующий виток...
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39872792
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
курсор клиентский должен быть
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39872811
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, понял. Спс.
А по поводу GetRows я разобрался: так можно передавать результат запроса в массив.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39872816
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, с клиентами я ещё не разбирался. Позже дойду до этого. Сижу тут, мучаюсь с переносом БД Access в MySql.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39872830
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у рекордсета при открытии надо задать атрибут adOpenClient
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39873429
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, я попробовал все режимы. В моём случае нет adOpenClient (возможно, это связано с версией MySql)
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39873431
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В обозревателе объектов также нет такого свойства
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39873510
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Set conn= New ADODB.Connection
conn.Open connectString
Set rs= New ADODB.recordset
sql="SELECT * FROM Customers"
rs.CursorLocation=adUseClient
rs.CursorType=adOpenStatic
rs.LockType=adLockReadOnly
rs.Open sql, conn
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874124
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, спасибо тебе большое. Это работает :)
Мне нужно было прогресс во время цикла забацать. В DAO, например, есть ещё фича rs.PercentPosition. Ваще круть.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874200
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,
А если упростить формат работы с MySQL , просто залинковать таблицы в Аксесс из MySQL?
Примерно около 5 лет живу на связке MS Access+MySQL. Через переходник mySql ODBC driver. На стороне аксесса таблицы смотрятся в классическом виде прилинкованных таблиц. Такие прилинкованные таблицы нельзя открыть без ввода логина и пароля пользователем при открытии аксесса. Как не пытайся)
Есть одна интересная фича, на которую натолкнулся совершенно случайно- Не обязательно в разделе настроек компьютера создавать именованный DNS экземпляр драйвера и прописывать для него там же путь к базе данных и логин и пароль. Можно залинковаться таким образом, что сами таблицы будут использовать среду драйвера, то есть без привязки к именованному источнику данных на компе. Если интересно ,могу выслать инструкцию как это сделать. Нигде не видел подобных примеров, скорее всего недокументированная фича ODBC.
Не надо будет лишний раз мучить ADO. (Единственно - для тех случаев, когда вы хотите чтобы ваш запрос выполнился самим сервером MySQL, а не клиентом. И вернул результат на клиент-Аксесс.)
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874393
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ЛаловЕсли интересно ,могу выслать инструкцию как это сделать.
Непременно. Если это полноценная инструкция или статья с полным порядком воспроизведения, может, ей и в ФАКе место найдётся.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874558
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов, мне очень интересно. Подойдёт инструкция в любом виде (даже текстовом). Хочу разобраться что к чему
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874885
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте попробую накидать, без проблем. Пока схематично:

Классический способ связи MySQL и MS Access, с привязкой к конкретному именованному источнику данных :
1) Скачивание MySQL ODBC Driver.
2) В разделе администрирование создание именованного источника данных с настройками подключения к базе MySQL.
(Опционально, пароль можно сохранить, а можно не сохранять в конце.)
3) Линковка таблиц в MS Access из MySQL через именованный созданный экземпляр драйвера.
Все данные по соединению прописываются в настройках линкованной таблицы
4) Работа с Аксессом в привычном виде, только к сожалению мы привязаны к именованному экземпляру источника данных, созданному в разделе администрирования ODBC виндоуз. Кратко по классике на скрине № 1 чуть ниже. Так в общем то делает большинство. Выкладываю скрин №1,чтобы показать классику. Наверное так делают практически все. Нестандартный способ без привязки к именованному экземпляру налеплю чуть ниже в отдельном письме.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874907
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сейчас нестандартный способ линковки, который позволяет не привязываться к именованному экземпляру драйвера MySQL. То есть никаких пользовательских источников в разделе администрирование создавать не надо, надо просто скачать драйвер с сайта (желательно скачивать и устанавливать на комп сразу и 32х и 64х битную версию. Официальный сайт: https://dev.mysql.com/downloads/connector/odbc ) и установить их на компьютер. Всё. Поехали:
1) линкуем таблицы в MS Access с сервера MYSQL программно , с использованием до боли знакомым дуцээмдэ в VBA:) , обратите внимание, что логин и пароль мы оставляем пустыми:
Код: vbnet
1.
2.
3.
4.
Private Sub Кнопка0_Click()
DoCmd.TransferDatabase acLink, "ODBC", "ODBC;DRIVER=MySQL ODBC 8.0 ANSI Driver;" _
& " SERVER=localhost; User=;Password=;DATABASE=db_sales", acTable, "tbl_sales", "tbl_sales"
End Sub



При линковке мы не прописываем имя источника данных, мы сразу обращаемся к драйверу. После выполнения линковки выскочит стандартное окошко mysql драйвера с просьбой ввести логин и пароль на сервере, вводим и таблица линкуется. И так для каждой таблицы/вьюхи на сервере mysql (можно циклом обойти, без проблем) Отдельное наблюдение-если вы установили соединение с первой таблицей, все остальные не будут требовать ввода логина и пароля для связывания. Самое главное не закрывать сессию текущую у аксесса . После того как все таблицы нужные залинкованы, мы закрываем базу. А дальше как с обычным аксессом. Обратите внимание на строку в свойствах таблицы при программном связывании таблиц. Сссылки на именованный экземпляр драйвера нет, логин и пароль не сохраняется. То есть при каждом входе в аксесс ,при открытии какой либо первой таблицы попросят ввести логин и пароль . При успехе, устанавливается доверительное соединение и в пределах сессии больше вводить их не надо.

При таком способе список именованных источников данных остается девственно чистым, и такую БД можно переслать куда угодно, самое главное чтобы на другом компе просто поставили драйвер MySQL)
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874908
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов, зачёт. Ща буду разбираться :)
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874911
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,
Да, все достаточно просто во втором случае. При программной линковке таблиц через VBA и MySQL ODBC просто нафиг не упоминать имя источника данных. Достаточно связи с самим драйвером. Вся эта раскривушка автоматом ляжет в строку подключения линкованной таблицы и сохранится. И потом можно юзать с любого компа, самое главное чтобы на нем дрова MySQL ODBC были. Создавать источник данных необязательно.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874921
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов, круто!
Это то, что мне было нужно. Только имя драйвера я поменял на {MySQL ODBC 5.1 Driver}
Фигурные скобочки Акцес сам поставил в описании таблицы, и я включил это в код.

Теперь я могу сделать цикл по всем таблицам и привязать их к Access автоматически без всяких там диалогов. Замечательно.
К стати о том, как я добираюсь до списка таблиц на сервер (может, кому понадобиться)
Создаю на сервере таблицу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE mtrx.`Таблицы MySQL` (
  таблица varchar(255) DEFAULT NULL
)
ENGINE = MYISAM,
CHARACTER SET utf8mb4,
CHECKSUM = 0,
COLLATE utf8mb4_general_ci;



Наполняю её...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub Обновить_список_таблиц_на_сервере()
'сервер запрещает подклчюаться к списку таблиц, _
поэтому я создаю этот список в таблице на сервере и подключаюсь к ней через ODBC, _
после чего мне доступен рекордсет :)

    Dim запрос As String
        
    'очистить таблицу
    cnn.Execute "TRUNCATE TABLE `Таблицы MySQL`;"
    
    'заполнить заново
    запрос = "INSERT INTO `Таблицы MySQL` ( `таблица` ) "
    запрос = запрос & "SELECT TABLES.TABLE_NAME "
    запрос = запрос & "FROM information_schema.TABLES "
    запрос = запрос & "WHERE TABLES.TABLE_SCHEMA = 'my_base';"
    cnn.Execute запрос
    
End Sub
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874928
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,
Отлично) Спасибо тоже! Положил в копилку вариант выборки таблиц из информационной схемы)
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39874929
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного не в тему, жалко что в аксесовском SQL нет команды TRUNCATE. Реально. Так можно было бы схлопнуть таблицу и создать новую гораздо быстрей. В аксе приходится два запроса пилить. Сначала DELETE . потом обнулять счетчик ALTER COLUMN.. ехе хе..
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39879609
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов, я после очистки таблиц просто запускаю комманду на сжатие. Счётчики обнуляются автоматически
CompactDatabase(SrcName As String, DstName As String, [DstLocale], [Options], [SrcLocale])
Разумеется, что файл с данными отдельно от программы. Мне это нужно лишь тогда, когда я я хочу очистить все таблицы для работы с чистого листа, так сказать.
...
Рейтинг: 0 / 0
Узнать количество строк в Recordset-е
    #39879611
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев,
Да, сжатие выручает, но если нужно во время открытой сессии и программы обнулить данные определенной конкретной таблицы, то я не слышал что такое можно в аксессе.
Можно с позиции простоты действия имею в виду. Так то решение есть, на основании таблицы делается запрос на создание новой таблицы (только структуры). Удаляется первая (с предварительным удалением связей), вторая свежесозданная таблица программно переименовывается так же как и первая . После этого делается новая связь между свежесозданной таблицей и остальными. (Если по замыслу создателя бд на уровне базы связи предусмотрены.)

А сжатием самой базы да, это помогает , но приходится закрывать саму программу. Эта проблема только в чистом аксесовском jet sql. Если акс в связке с мускулом, то естественно там все в этом плане норм.)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Узнать количество строк в Recordset-е
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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