powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / И ещё раз об ID новой записи
14 сообщений из 14, страница 1 из 1
И ещё раз об ID новой записи
    #32309104
Ivan_81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет All
Здесь уже был топик на тему как узнать ID новой записи. Но как узнать сей ID если запись добавлена не через addnew, а через sql запрос "NSERT INTO".
Может кто подскажет?
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32309171
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
CurrentProject.Connection.Execute "INSERT INTO Траты ( [Код Клиента], Сумма ) " _
& "values( 1 , 1000)"
rst.Open "SELECT @@identity as dd", CurrentProject.Connection
MsgBox rst!dd
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32309182
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 Хам:

А если за время между Execute и rst.Open другой юзер тоже вставит запись, то что будет?
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32309216
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч
Уже обсуждалось. Ничего не будет.
Поиск по слову identity
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32312572
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Не работает. Вот человек проверил, что оно не работает, и никто ничего не возразил. \r
\r
/topic/21542&hl=identity\r
\r
А мне как раз этот вопрос-ответ нужен, чтобы добить фак про счетчики. Итак, вот вопросы к тем, кто знает:\r
\r
1. Правильно ли я понимаю, что это работает только в ADO и только в Аксессе начиная с 2000? Если да, то как быть в более ранних версиях?\r
\r
2. Работает ли это только с базой SQL сервера или с базой Аксесса тоже?\r
\r
3. Как указывать имя поля? Если этот счетчик не является Primary Key, то как это сработает?\r
\r
4. Все-таки - что будет, если два юзера добавят запись одновременно? Что надо делать, чтобы обеспечить получение именно своего значения счетчика? (Я пошел искать по identity, но получил слишком много топиков, в которых, в числе прочего, было сказано, что этот способ не работает вообще.)\r
\r
5. Сколько записей вернет этот самый SELECT @@identity? Или значение этого @@identity во всех записях будет одинаковое? Если одинаковое во всех, то не оптимальнее ли делать top 1?
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32312748
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, хотел ведь еще раньше ответить, но что-то мне помешало.

1. Правильно ли я понимаю, что это работает только в ADO и только в Аксессе начиная с 2000? Если да, то как быть в более ранних версиях?
Правильно. В более ранних - запросом никак, только добавлять записи через Recordset
Немного подумал и решил, что не совсем правильно. Эта фича появилась не в аксесе, а в Jet'е. Как вариант (не проверял) оно может и будет работать, если используя Jet 4.0 открыть базу 97-го аксеса.

2. Работает ли это только с базой SQL сервера или с базой Аксесса тоже?
С аксесом тоже

3. Как указывать имя поля? Если этот счетчик не является Primary Key, то как это сработает?
Оно возвращает не значение ключа, а значение поля-счетчика. А счетчик в таблице может быть максимум в одном экземпляре. Так что имя поля указывать не надо.
Интересно, а что вернется если в таблице вообще счетчика не было?

4. Все-таки - что будет, если два юзера добавят запись одновременно? Что надо делать, чтобы обеспечить получение именно своего значения счетчика? (Я пошел искать по identity, но получил слишком много топиков, в которых, в числе прочего, было сказано, что этот способ не работает вообще.)
Насколько я помню, умные книги утверждают что возвращается последнее identity текущей сессии. Т.е. на другого пользователя пофигу.
Ссылку на топик где сказано, что этот способ не работает вообще, кинь плиз. Есть подозрение, что там шла речь об SQL Server, а там свои тараканы (в частности с триггерами).

5. Сколько записей вернет этот самый SELECT @@identity? Или значение этого @@identity во всех записях будет одинаковое? Если одинаковое во всех, то не оптимальнее ли делать top 1?
SELECT @@identity вернет набор, состоящий из одной записи и одного поля.
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32312751
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Большой thanx!!!

> Как вариант (не проверял) оно может и будет работать, если используя Jet 4.0 открыть базу 97-го аксеса.

И подцепить ADO? Или не обязательно?

> Интересно, а что вернется если в таблице вообще счетчика не было?

Проверим...

> Насколько я помню, умные книги утверждают что возвращается последнее identity текущей сессии.

Нет ли каких-нибудь подводных камней типа того, что нельзя пользоваться CurrentDb (и т.п.), который каждый раз создает ссылку заново?

> Ссылку на топик где сказано, что этот способ не работает вообще, кинь плиз.

Она в том же посте, на который ты сейчас отвечал.

> SELECT @@identity вернет набор, состоящий из одной записи и одного поля.

А если SELECT @@identity, MyField1, MyField2?
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32312752
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавление про SQL SERVER:
Если триггер срабатывает - то можно использовать SCOPE_IDENTITY:
Returns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch.
(с) BOL
В FAQ описаны способы работы.
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32313227
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох, ау, однако!
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32313262
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чего я то сразу?

> Как вариант (не проверял) оно может и будет работать, если используя Jet 4.0 открыть базу 97-го аксеса.
И подцепить ADO? Или не обязательно?

Если из 97-го работать с базой 97-го же, но хочется через Jet 4.0 - то, видимо, только через ADO
Если из 2000-го хотим работать с базой 97-го - то и DAO тоже можно.

Нет ли каких-нибудь подводных камней типа того, что нельзя пользоваться CurrentDb (и т.п.), который каждый раз создает ссылку заново?
А хрен его знает товарисч майор

> Ссылку на топик где сказано, что этот способ не работает вообще, кинь плиз.
Она в том же посте, на который ты сейчас отвечал.

Какая-то она ... как бы это сказать... ну не работает у человека что-то, ну и что? Мало ли кто чего сказал :)

А если SELECT @@identity, MyField1, MyField2?
А хрен его знает товарисч майор. А оно тебе надо?
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32313292
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> А чего я то сразу?

А мы разве не с тобой разговаривали? :^)

Благодарствую. Переварю - вставлю в фак.
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32314191
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A MSDN слабо почитать?
Вот выдержка ( полная статья тут)

The @@IDENTITY variable

The @@IDENTITY variable is a global SQL variable that you can use to retrieve the last value used in a COUNTER data type column. You can't specify a table name when retrieving the @@IDENTITY variable. The value returned is always from the last table with a COUNTER field that had a new record added to it from code. Use the SELECT statement to retrieve the @@IDENTITY value.

SELECT @@IDENTITY

To add a value to the @@IDENTITY value, enclose the variable in square brackets.

SELECT [@@IDENTITY] + 1

Note The @@IDENTITY variable listed in the previous SQL statements can be executed only through the Jet OLE DB provider and ADO (выделено мной); it will result in a value of 0 if used through the Access SQL View user interface. In addition, the variable is set only when records are inserted through programming code. If a record is inserted through the user interface, either with datasheets, forms, or SQL statements in the Access SQL View window, the @@IDENTITY variable will return 0. For this reason, the value of @@IDENTITY is only accurate immediately after adding a record from code.
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32314200
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Спасибо! Но я все равно плохо понимаю:

> executed only through the Jet OLE DB provider and ADO

Что такое Jet OLE DB provider? Это нечто служащее для присоединения к Аксессу из других аппликаций? В самом Аксессе, получается, только ADO?
...
Рейтинг: 0 / 0
И ещё раз об ID новой записи
    #32314217
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое Jet OLE DB provider? Это нечто служащее для присоединения к Аксессу из других аппликаций
Где-то так , но не ОDBC :).
В самом Аксессе, получается, только ADO?
Да.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / И ещё раз об ID новой записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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