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

Иначе - итерируешь, проверяешь на конец, нет - следующий виток...
...
Рейтинг: 0 / 0
07.10.2019, 17:19
    #39872792
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
курсор клиентский должен быть
...
Рейтинг: 0 / 0
07.10.2019, 17:28
    #39872811
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Akina, понял. Спс.
А по поводу GetRows я разобрался: так можно передавать результат запроса в массив.
...
Рейтинг: 0 / 0
07.10.2019, 17:32
    #39872816
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Konst_One, с клиентами я ещё не разбирался. Позже дойду до этого. Сижу тут, мучаюсь с переносом БД Access в MySql.
...
Рейтинг: 0 / 0
07.10.2019, 17:51
    #39872830
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
у рекордсета при открытии надо задать атрибут adOpenClient
...
Рейтинг: 0 / 0
08.10.2019, 15:20
    #39873429
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Konst_One, я попробовал все режимы. В моём случае нет adOpenClient (возможно, это связано с версией MySql)
...
Рейтинг: 0 / 0
08.10.2019, 15:21
    #39873431
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
В обозревателе объектов также нет такого свойства
...
Рейтинг: 0 / 0
08.10.2019, 17:01
    #39873510
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Код: 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
09.10.2019, 15:22
    #39874124
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Konst_One, спасибо тебе большое. Это работает :)
Мне нужно было прогресс во время цикла забацать. В DAO, например, есть ещё фича rs.PercentPosition. Ваще круть.
...
Рейтинг: 0 / 0
09.10.2019, 16:39
    #39874200
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Настаев,
А если упростить формат работы с MySQL , просто залинковать таблицы в Аксесс из MySQL?
Примерно около 5 лет живу на связке MS Access+MySQL. Через переходник mySql ODBC driver. На стороне аксесса таблицы смотрятся в классическом виде прилинкованных таблиц. Такие прилинкованные таблицы нельзя открыть без ввода логина и пароля пользователем при открытии аксесса. Как не пытайся)
Есть одна интересная фича, на которую натолкнулся совершенно случайно- Не обязательно в разделе настроек компьютера создавать именованный DNS экземпляр драйвера и прописывать для него там же путь к базе данных и логин и пароль. Можно залинковаться таким образом, что сами таблицы будут использовать среду драйвера, то есть без привязки к именованному источнику данных на компе. Если интересно ,могу выслать инструкцию как это сделать. Нигде не видел подобных примеров, скорее всего недокументированная фича ODBC.
Не надо будет лишний раз мучить ADO. (Единственно - для тех случаев, когда вы хотите чтобы ваш запрос выполнился самим сервером MySQL, а не клиентом. И вернул результат на клиент-Аксесс.)
...
Рейтинг: 0 / 0
10.10.2019, 08:18
    #39874393
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Сергей ЛаловЕсли интересно ,могу выслать инструкцию как это сделать.
Непременно. Если это полноценная инструкция или статья с полным порядком воспроизведения, может, ей и в ФАКе место найдётся.
...
Рейтинг: 0 / 0
10.10.2019, 13:44
    #39874558
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Сергей Лалов, мне очень интересно. Подойдёт инструкция в любом виде (даже текстовом). Хочу разобраться что к чему
...
Рейтинг: 0 / 0
10.10.2019, 19:42
    #39874885
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Давайте попробую накидать, без проблем. Пока схематично:

Классический способ связи MySQL и MS Access, с привязкой к конкретному именованному источнику данных :
1) Скачивание MySQL ODBC Driver.
2) В разделе администрирование создание именованного источника данных с настройками подключения к базе MySQL.
(Опционально, пароль можно сохранить, а можно не сохранять в конце.)
3) Линковка таблиц в MS Access из MySQL через именованный созданный экземпляр драйвера.
Все данные по соединению прописываются в настройках линкованной таблицы
4) Работа с Аксессом в привычном виде, только к сожалению мы привязаны к именованному экземпляру источника данных, созданному в разделе администрирования ODBC виндоуз. Кратко по классике на скрине № 1 чуть ниже. Так в общем то делает большинство. Выкладываю скрин №1,чтобы показать классику. Наверное так делают практически все. Нестандартный способ без привязки к именованному экземпляру налеплю чуть ниже в отдельном письме.
...
Рейтинг: 0 / 0
10.10.2019, 20:25
    #39874907
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
А сейчас нестандартный способ линковки, который позволяет не привязываться к именованному экземпляру драйвера 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
10.10.2019, 20:26
    #39874908
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Сергей Лалов, зачёт. Ща буду разбираться :)
...
Рейтинг: 0 / 0
10.10.2019, 20:33
    #39874911
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Настаев,
Да, все достаточно просто во втором случае. При программной линковке таблиц через VBA и MySQL ODBC просто нафиг не упоминать имя источника данных. Достаточно связи с самим драйвером. Вся эта раскривушка автоматом ляжет в строку подключения линкованной таблицы и сохранится. И потом можно юзать с любого компа, самое главное чтобы на нем дрова MySQL ODBC были. Создавать источник данных необязательно.
...
Рейтинг: 0 / 0
10.10.2019, 21:04
    #39874921
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Сергей Лалов, круто!
Это то, что мне было нужно. Только имя драйвера я поменял на {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
10.10.2019, 21:59
    #39874928
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Настаев,
Отлично) Спасибо тоже! Положил в копилку вариант выборки таблиц из информационной схемы)
...
Рейтинг: 0 / 0
10.10.2019, 22:26
    #39874929
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Немного не в тему, жалко что в аксесовском SQL нет команды TRUNCATE. Реально. Так можно было бы схлопнуть таблицу и создать новую гораздо быстрей. В аксе приходится два запроса пилить. Сначала DELETE . потом обнулять счетчик ALTER COLUMN.. ехе хе..
...
Рейтинг: 0 / 0
21.10.2019, 22:12
    #39879609
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Сергей Лалов, я после очистки таблиц просто запускаю комманду на сжатие. Счётчики обнуляются автоматически
CompactDatabase(SrcName As String, DstName As String, [DstLocale], [Options], [SrcLocale])
Разумеется, что файл с данными отдельно от программы. Мне это нужно лишь тогда, когда я я хочу очистить все таблицы для работы с чистого листа, так сказать.
...
Рейтинг: 0 / 0
21.10.2019, 22:32
    #39879611
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в Recordset-е
Настаев,
Да, сжатие выручает, но если нужно во время открытой сессии и программы обнулить данные определенной конкретной таблицы, то я не слышал что такое можно в аксессе.
Можно с позиции простоты действия имею в виду. Так то решение есть, на основании таблицы делается запрос на создание новой таблицы (только структуры). Удаляется первая (с предварительным удалением связей), вторая свежесозданная таблица программно переименовывается так же как и первая . После этого делается новая связь между свежесозданной таблицей и остальными. (Если по замыслу создателя бд на уровне базы связи предусмотрены.)

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


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