|
|
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Привет All Здесь уже был топик на тему как узнать ID новой записи. Но как узнать сей ID если запись добавлена не через addnew, а через sql запрос "NSERT INTO". Может кто подскажет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2003, 15:13 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2003, 15:42 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
2 Хам: А если за время между Execute и rst.Open другой юзер тоже вставит запись, то что будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2003, 15:45 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
2 Саныч Уже обсуждалось. Ничего не будет. Поиск по слову identity ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2003, 16:03 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Не работает. Вот человек проверил, что оно не работает, и никто ничего не возразил. \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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2003, 15:37 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Блин, хотел ведь еще раньше ответить, но что-то мне помешало. 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 вернет набор, состоящий из одной записи и одного поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2003, 13:39 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Большой thanx!!! > Как вариант (не проверял) оно может и будет работать, если используя Jet 4.0 открыть базу 97-го аксеса. И подцепить ADO? Или не обязательно? > Интересно, а что вернется если в таблице вообще счетчика не было? Проверим... > Насколько я помню, умные книги утверждают что возвращается последнее identity текущей сессии. Нет ли каких-нибудь подводных камней типа того, что нельзя пользоваться CurrentDb (и т.п.), который каждый раз создает ссылку заново? > Ссылку на топик где сказано, что этот способ не работает вообще, кинь плиз. Она в том же посте, на который ты сейчас отвечал. > SELECT @@identity вернет набор, состоящий из одной записи и одного поля. А если SELECT @@identity, MyField1, MyField2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2003, 13:50 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Добавление про 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 описаны способы работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2003, 13:50 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Лох, ау, однако! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2003, 11:33 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
А чего я то сразу? > Как вариант (не проверял) оно может и будет работать, если используя Jet 4.0 открыть базу 97-го аксеса. И подцепить ADO? Или не обязательно? Если из 97-го работать с базой 97-го же, но хочется через Jet 4.0 - то, видимо, только через ADO Если из 2000-го хотим работать с базой 97-го - то и DAO тоже можно. Нет ли каких-нибудь подводных камней типа того, что нельзя пользоваться CurrentDb (и т.п.), который каждый раз создает ссылку заново? А хрен его знает товарисч майор > Ссылку на топик где сказано, что этот способ не работает вообще, кинь плиз. Она в том же посте, на который ты сейчас отвечал. Какая-то она ... как бы это сказать... ну не работает у человека что-то, ну и что? Мало ли кто чего сказал :) А если SELECT @@identity, MyField1, MyField2? А хрен его знает товарисч майор. А оно тебе надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2003, 11:46 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
> А чего я то сразу? А мы разве не с тобой разговаривали? :^) Благодарствую. Переварю - вставлю в фак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2003, 11:57 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2003, 22:31 |
|
||
|
И ещё раз об ID новой записи
|
|||
|---|---|---|---|
|
#18+
Спасибо! Но я все равно плохо понимаю: > executed only through the Jet OLE DB provider and ADO Что такое Jet OLE DB provider? Это нечто служащее для присоединения к Аксессу из других аппликаций? В самом Аксессе, получается, только ADO? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2003, 22:44 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32309216&tid=1678482]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
89ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 450ms |

| 0 / 0 |
