powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ODBC + MySql получение id (ключа-счетчика) в момент создания записи
14 сообщений из 14, страница 1 из 1
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39968275
тему "DAO + ODBC + MySql получение ключа-счетчика в момент создания записи " просмотрел

https://www.sql.ru/forum/1320636-a/dao-odbc-mysql-poluchenie-klucha-schetchika-v-moment-sozdaniya-zapisi


Задача - получить id созданной на сервере записи.

У меня схожая проблема, но без ADO/DAO.

1. Есть база MS Access, формат 2007. Есть база на сервере MySql. Есть присоединение по ODBC.
2. Я добавляю запись в базу MySql из модуля Access.
- Создаю sql строку в формате, который понимает MySql. "INSERT INTO..."
- Создаю "запрос к серверу" с подключением ODBC
- В свойство .sql запроса задаю строку в формате MySql
- Выполняю запрос.
3. Запись добавляется, но я не могу сразу получить в Access id созданной записи.

Сейчас я просто делаю в одном из поле уникальный идентификатор для новой записи, отдельным запросом получаю с сервера этот самый несчастный id, потом обновляю запись и дальше все без пробем работает. Но как-то корявенько выглядит. Хочется сразу id получить.

Если я тот же самый "INSERT INTO..." выполняю в окне phpmyadmin, то выдается номер созданной записи. А если из Аксесс, то никак.


4. Пробовал играть с .ReturnsRecords = True, пробовал выполнять запрос и по db.Execute, и по DoCmd.OpenQuery, и как openrecordset тоже пробовал. Нет ответа и все тут.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Function FRQUERY(StrokaSqlRequests As String)
' Выполнить запрос на сервере.

On Error Resume Next

Dim Base_Name As String

Dim Qry As DAO.QueryDef
Set Qry = CurrentDb.CreateQueryDef("")

Base_Name = "ODBC;DSN=" & DSN_Name & ";"
Qry.Connect = Base_Name
Qry.ReturnsRecords = False
Qry.SQL = StrokaSqlRequests
Qry.Execute
Set Qry = Nothing

End Function



Надеюсь на коллективный разум. Задачка-то типовая. Должен же быть какой-то простой способ.
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39968291
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Михайлович Л,
Выход прост, используйте
LAST_INSERT_ID(). Так как вы работаете с mysql, вы запросто можете использовать сразу в запросе
на добавление второй запрос SELECT last_insert_id() через делиметр. Он все вытащит. Это один из вариантов. Посмотрите в сети вышеуказанную функцию. Примеры работы. Примеров полно)
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39968292
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если принципиально с vba и dao, то
...
Recordset.LastModified
...
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39968340
Сергей Лалов,

авторВыход прост, используйте
LAST_INSERT_ID(). Так как вы работаете с mysql, вы запросто можете использовать сразу в запросе
на добавление второй запрос SELECT last_insert_id() через делиметр. Он все вытащит. Это один из вариантов. Посмотрите в сети вышеуказанную функцию. Примеры работы. Примеров полно)

что-то не получается. Когда я на сервере выполняю все работает.

Код: vbnet
1.
INSERT INTO *** (***)VALUES (***);SELECT LAST_INSERT_ID( ); 



А когда этот же SQL через запрос бросаю, ничего в базе не происходит. Нет добавления записи в таблицу.

Или аксес не умеет пробрасывать две команды в одной строке sql или я где-то туплю.
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39968374
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем пробрасывать "в одну строку" ?
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39968814
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Михайлович Л,
Ну как продвигается решение? В вашем коде первоначальном DAO добавить всего одну строчку кода)
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969387
Сергей Лалов,

Не получилось.

Наткнулся на сайте https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-usagenotes-functionality-last-insert-id.html на объяснение, что как раз с Access и не работает.

Certain ODBC applications (including Delphi and Access) may have trouble obtaining the auto-increment value using the previous examples. In this case, try the following statement as an alternative:

авторSELECT * FROM tbl WHERE auto IS NULL;

This alternative method requires that sql_auto_is_null variable is not set to 0. See Server System Variables.

Этот вариант тоже не срабатывает. Мне запрещено менять настройки MySql.
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969388
Leonid Kudryavtsev,

С этой базой одновременно работает пара десятков человек. Если я сделаю два разных запрос а к серверу, то есть большая вероятность, что получу ответ именно уже по следующей добаленной другим пользователем записи.
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969451
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Михайлович Л
Если я сделаю два разных запрос а к серверу, то есть большая вероятность, что получу ответ именно уже по следующей добаленной другим пользователем записи.


я вас уверяю, что эта вероятность не большая, а ничтожно мала... это легко проверить - на счет 1,2,3 нажмите одновременно кнопки на нескольких компах... Если нужна 100% гарантия, попробуйте два запроса поместить в одну транзакцию
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969456
Добрые люди сказали, что через ADODB.Connection заработает.
Таки получилось

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Function add_mysql(StrokaSqlRequests As String) As Integer

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field

'connect to MySQL server using Connector/ODBC
Set conn = New ADODB.Connection
conn.ConnectionString = DSN_Name
conn.Open

'direct insert
conn.Execute StrokaSqlRequests

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer


rs.Open "SELECT LAST_INSERT_ID();", conn
rs.MoveFirst

'Debug.Print rs.Fields("LAST_INSERT_ID()")
add_mysql = rs.Fields("LAST_INSERT_ID()")

rs.Close



End Function
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969482
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Михайлович Л,

Ну и где гарантия, что после conn.Execute StrokaSqlRequests не получим чужой "SELECT LAST_INSERT_ID();" ?
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969487
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag
Ну и где гарантия, что после conn.Execute StrokaSqlRequests не получим чужой "SELECT LAST_INSERT_ID();" ?
если немного погуглить, то найдём примерно следующее LAST_INSERT_ID() будет верным для данной сессии, то есть это последний id в данной сессии. Использовать его безопасно с точки зрения одновременных подключений.То есть на одном конекшене получишь ID последний созданный именно на этом конекшене, а не какой-то другой. И это логично. На SQL Servere так же...
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969488
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Михайлович Л
Код: vbnet
1.
2.
conn.Execute StrokaSqlRequests
add_mysql = conn.Execute( "SELECT LAST_INSERT_ID();")(0)

так короче...
...
Рейтинг: 0 / 0
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
    #39969494
Панург,

Спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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