|
|
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
периодически наблюдал дублирующиеся счетчики Есть такая плохость. Возможно, она иногда возникает, если в таблицу запросом "доливать" записи со значениями поля-счетчика, меньшими текущего максимального, но с несуществующими. Т.е. у меня был случай, когда я по какой-то причине разбил таблицу на две, а потом слил все записи обратно. Сначала более позднюю часть, потом раннюю. И Акс стал считать счетчик с последнего значения ранней половины. И создавать дубли. Я, когда увидел, несколько растерян был. Т.е. это возможно по такой причине. А может и еще из-за чего... Но факт, что бывает. И поэтому счетчик д.б. уникальным индексом. Тогда все будет ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 18:14 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
2 Сенин Виктор Там где нет уникального первичного ключа? Дык у меня таких счетчиков и нет (и не было, да и не будет) У меня такое тоже случайно возникло. Ну недоглядел чуток . А так действительно - счетчик без уникальности просто нафиг не нужен. Чуть раньше Так что можно не париться, надо лишь отследить Error в случае ошибки сохранения и сбросить нафиг полученное значение. Так можно и вообще тогда от счетчиков отказаться. Что я с успехом и практикую. 2 Саныч Это значит, что счетчики могут дублироваться. Но это не значит, что в процессе добавления записи значение счетчика может меняться. Но и не значит что не может. Как только делаешь уникальный индекс - все работает как надо. Значит, счетчик либо подругому получается (новое значение), либо запись по другому вставляется (с проверкой и переполучением счетчика). Что именно происходит - мне неизвестно, ибо специально воспроизвести такую ситуацию не получается, никакие брекпоинты не помогают. Так что я и гадать даже не берусь. 2 Geo И такое тоже есть. Добавление записи запросом с явным указанием значения счетчика - единственный известный мне способ управления этим значением. И все следующие записи будут получать значения счетчика начиная от добавленного значения. Кстати, решил проверить последнее предложение - хрен там. В ХР-шном аксесе ID-шники продолжают вставляться с нормальными значениями, наплевав на добавленную запросом запись. Хотя в 97-м описанный эффект имеет место быть (сам видел). Так что какие-то отличия уже всплывают. 2 All Не фиг. Или присваивать идентификаторы вручную, или, если уж мы отдаем это на откуп аксесу, то брать результаты его работы по ее завершению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 18:35 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
И хотя я еще совсем молодой программерр..., на эти грабельки уже успел наступить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 18:37 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
Лох, мне нечего возразить. Как в том старом еврейском анекдоте: "И ты прав, и ты прав" (если надо, приведу анекдот полностью). Я сердцем чувствую, что я прав, но головой знаю, что аргументов у меня нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 18:40 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
2ЛП Но то, что акцес иногда создает дубли (сбрасывает значение "текущего максимума" в таблице) совсем не означает, что он может менять этот максимум "на ходу". Как раз наоборот. Подобная ситуация возникает при "нештатносях". Чтобы он менял счетчик с момента .AddNew и до момента после .Update - такого я еще не видел. Возможно, так просто не бывает. Или бывает у баз, бьющихся в конвульсиях :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 18:50 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
2 Geo А я ни разу не смог специально увидеть, чтобы ему удалось два одинаковых счетчика получить. Вот как не бился и куда только точки останова не ставил - всегда он разные получает. А на живой базе - да пожалуйста. Причем база в конвульсиях не билась. Так что если мы чего-то не можем сделать - не значит что аксес этого не может. Более того. Только что вспомнил. В процессе добавления текущее значение счетчика в добавляемой записи не всегда доступно . Имел счастье это наблюдать при какой-то хитрой схеме данных. Т.е. несколько таблиц, уникальные индексы по счетчикам, связи с обеспечением целостности по полям типа счетчик, формочки, висящие на этих таблицах. Точнее уже не вспомню сходу. При добавлении записей через форму - на BeforeUpdate брал текущее значение счетчика (из контрола на форме) и добавлял нужные записи в другую таблицу. Такой вот триггер для бедных . Так вот. Если добавлялось сразу несколько записей (через буфер обмена) - при обращении к ID-шнику выдавалось сообщение о невозможности чтения ввиду установленной блокировки на чтение (!). У меня тогда глаза на лоб вылезли. Пока с этим экспериментировал - выяснил, что если убить связь с обеспечением целостности данных, то все становится ок. Если добавлять записи по одной - тож все ок. А вместе - не живут, моя же формочка сама себе выставляет блокировку на чтение. Это, конечно, экстремальные условия, но все же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 19:04 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
2Саныч >Как в том старом еврейском анекдоте: "И ты прав, и ты прав" (если надо, приведу анекдот полностью) Мне этот анекдот известен как китайская народная мудрость. Или китайцы тоже евреи ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 19:36 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
> Мне этот анекдот известен как китайская народная мудрость. На всякий случай сверим анекдоты. Код: plaintext 1. 2. 3. 4. > Или китайцы тоже евреи? Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 21:25 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
...Попытался запостить через новую версию форума, а оно не запостилось. Дублирую. 2 Лох: То, что счетчик иногда оказывается недоступен, - это совершенно отдельная майса. Видимо, Аксесс так и поступает: в тех случаях, когда возникают проблемы со значением счетчика в новой записи, счетчик делается недоступным. И это как раз значит, что можно не бояться той ситуации, которой мы собирались бояться: счетчик не изменит значения в момент сохранения записи, а просто программа выдаст ошибку при попытке прочитать значение счетчика. Но даже и этого, похоже, можно не бояться, потому что AddNew никогда не добавляет несколько записей сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 21:46 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
Set rst = dbs.OpenRecordset("SELECT @@Identity FROM tblFoo") Debug.Print rst.Fields(0).Value ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 21:50 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
2 Саныч UpdateBatch? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 00:29 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
Это я к тому, что AddNew никогда не добавляет несколько записей сразу. Господа, хрен знает как этот долбаный счетчик работает. Я, например, единственный раз в жизни увидел блокировку на чтение. Стараюсь по возможности счетчиков избегать, но иногда лень берет верх :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 00:58 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
Не дополз до лестницы Мааароооссс маааарроооооосс Ннниии мааарроззьь мииняяаааа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 01:00 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
http://support.microsoft.com/?kbid=221931 Ссылка по теме... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 09:11 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
> UpdateBatch? А чего UpdateBatch? Я-то говорю, что значение счетчкика образуется в момент AddNew... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 16:53 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
> Ссылка по теме... Да. Там сказано, что в ADO счетчик вообще будет выдавать 0. Это неявно подразумевает, что в DAO, к которому люди привыкли, все в порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 16:56 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
>>Видимо, Аксесс так и поступает: в тех случаях, когда возникают проблемы со значением счетчика в новой записи, счетчик делается недоступным. Думается: есть объект "счетчик". Есть _обращение_, вызывающее _возврат_ текущего значениия "счетчик"-а _и_ его _приращение_. //По умолчанию это выглядит как aF.default = Fcounter().// Есть процедура (_отдельно_!!!), наваривающая значение (повторяющая обращение к счетчику) в случае _ошибки_ сохранения (.update). Т.ч. не "счетчик" _делается_ недоступным, а: 1)(минимум) _сохранение записи_ недоступно из-за нарушения целостности, 2)(Максимум) при ошибке сохранение производится /автоматом/ повтор запроса _значения счетчика_ (с его инкрементированием), результат сохраняется, 3)(разрушенные индексы, или отсутствие требования целостности) сохраняется "дублированная по счетчику" запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 18:46 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
меня одно время парило что в одном случае значение счетчика в поле рекордсета появлялось - после addnew но до update а во втором после update разница была ADO или DAO или тип набора и блокировки другой - уже не помню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 19:21 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
Думается: есть объект "счетчик". Есть _обращение_, вызывающее _возврат_ текущего значениия "счетчик"-а _и_ его _приращение_. А мне кажется, иначе. Помнишь, как хранятся строки в паскале-бейсике? Байт-другой, содержащий длину строки, и собственно строка. Думаю, что и счетчик живет где-нибудь в заголовке таблицы, и хранит текущее максимальное значение. Примерно проверяю... ... Да. 1) Создал чистую базу, сделал в ней таблицу со счетчиком и десятком полей, запустил в ней функцию, в цикле делающую .AddNew без упдате. База не выросла не на йоту. 2) Такая схема реализуется проще с точки зрения микрософта. Блокируем таблицу. Увеличиваем в ней четырех байтовое значение. Разблокируем таблицу. Блокируем запись. Работаем. У строки нет объекта "длина" не потому, что его невозможно сделать, а потому, что он не нужен. По поводу ошибок при дублирование. Предположим, нам удалось сбросить свойство таблицы "текущий счетчик 0". И при создании новой записи создается дубль счетчика. Так бывает. В большинстве случаев, когда счетчик - ключевое поле, сообщение о повторяющемся индексе выдается именно при попытке сохранить запись. А не при .AddNew Но это так, досужие домыслы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 23:31 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
2 Geo Я сказал, что есть "объект". (Т.е. нечто). А ты сказал, что он (объект) не бомж, а прописан при таблице. И чЬто? Он перестал быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2003, 11:37 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
Объек, по-моему, отличается наличием св-в, событий и прочей мишуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2003, 14:52 |
|
||
|
Как узнать id (тип счётчик) только что вставленной строки?
|
|||
|---|---|---|---|
|
#18+
А я говорил об "объекте" в смысле ООП? Я не помню, чтобы объекты СУБД и объекты ООП были "одним и тем же". :0) ООП проявляется как набор интерфейсов доступа к объектам ("сущностям") СУБД. И только тогда (т.е. в DAO, ADO) можно говорить о свойствах и методах в смысле ООП. До того - упоминание объекта не отягощено ООП-шным контекстом :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2003, 15:00 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32268468&tid=1679359]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 479ms |

| 0 / 0 |
