Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ODBC + MySql получение id (ключа-счетчика) в момент создания записи / 14 сообщений из 14, страница 1 из 1
11.06.2020, 14:56
    #39968275
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
тему "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
11.06.2020, 15:28
    #39968291
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Михаил Михайлович Л,
Выход прост, используйте
LAST_INSERT_ID(). Так как вы работаете с mysql, вы запросто можете использовать сразу в запросе
на добавление второй запрос SELECT last_insert_id() через делиметр. Он все вытащит. Это один из вариантов. Посмотрите в сети вышеуказанную функцию. Примеры работы. Примеров полно)
...
Рейтинг: 0 / 0
11.06.2020, 15:30
    #39968292
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Если принципиально с vba и dao, то
...
Recordset.LastModified
...
...
Рейтинг: 0 / 0
11.06.2020, 18:14
    #39968340
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Сергей Лалов,

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

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

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



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

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

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

Наткнулся на сайте 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
15.06.2020, 15:13
    #39969388
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Leonid Kudryavtsev,

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


я вас уверяю, что эта вероятность не большая, а ничтожно мала... это легко проверить - на счет 1,2,3 нажмите одновременно кнопки на нескольких компах... Если нужна 100% гарантия, попробуйте два запроса поместить в одну транзакцию
...
Рейтинг: 0 / 0
15.06.2020, 16:52
    #39969456
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Добрые люди сказали, что через 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
15.06.2020, 18:07
    #39969482
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC + MySql получение id (ключа-счетчика) в момент создания записи
Михаил Михайлович Л,

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

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

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


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