Дублирующие записи

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Дублирующие записи

Сообщение Sirik » 28.11.2018 (Ср) 10:51

Всем привет.
На удаленном SQL сервере лежит БД, в ней таблица с несколькими полями, одно из которых - это некий номер в порядке возрастания. При каждом добавлении записи, программа-клиент запрашивает последний номер, инкриминирует его и вносит новую запись.
Так вот в чем проблема: если сервер немного подлагивает, при запросе, 2 юзера получают одно и тоже число и соответственно вносят свои записи с одинаковыми номерами, т.е. происходит дубляж.
Самое печальное то, что юзеры ходят на сервер под одной учеткой (я к сожалению не админ этого сервера), т.е. как я понимаю, блокировка таблицы невозможна (монопольный доступ), пробовал выставить флаг подключения в adModeShareExclusive, не помогло.

Так вот вопрос: как можно реализовать, чтобы юзеры не дублировали записи?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дублирующие записи

Сообщение iGrok » 28.11.2018 (Ср) 11:23

1. Блокировка - она не про учётку а про конкретную сессию. Т.е. должна сработать.
2. Не видя структуру бд сложно сказать, но, может, сделать поле с ид автоинкрементным?
label:
cli
jmp label

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Дублирующие записи

Сообщение Sirik » 28.11.2018 (Ср) 12:22

Авто нельзя, поле не уникальное.
На счет блокировки, может я неправильно ее делаю? Вот код:
Код: Выделить всё

    Dim cn As New ADODB.Connection

.....

    cn.Provider = "SQLOLEDB"
    cn.Mode = adModeShareExclusive
    cn.ConnectionString = "Data Source='XXX.XXX.XXX.XXX';Database=DB;User Id='user';Password='pass';"
    cn.Open
....


    cn.Close
    Set cn = Nothing

Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Дублирующие записи

Сообщение alibek » 29.11.2018 (Чт) 16:41

Блокировку можно поставить пессимистическую.
А нумерацию обычно делают хранимой процедурой на сервере, а не считают на клиенте.
Lasciate ogni speranza, voi ch'entrate.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Дублирующие записи

Сообщение Sirik » 03.12.2018 (Пн) 9:32

Согласен, на стороне сервера идеальное решение, остается вопрос как это сделать?
Как вызвать хранимую процедуру с параметрами и получить ответ?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Дублирующие записи

Сообщение alibek » 03.12.2018 (Пн) 9:47

Есть много способов, зависит от СУБД, ЯП и используемой библиотеки доступа к данным.
Но практически все СУБД умеют запускать хранимые процедуры, возвращающие значение, и практически все библиотеки умеют вызывать хранимые процедуры и получать возвращаемое значение.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Дублирующие записи

Сообщение Andrey Fedorov » 04.03.2019 (Пн) 13:52

В MS SQL для поля таблицы достаточно установить свойство IDENTITY и не мудрить!

P.S
Давно тут не был...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Дублирующие записи

Сообщение HandKot » 04.03.2019 (Пн) 15:30

Andrey Fedorov писал(а):В MS SQL для поля таблицы достаточно установить свойство IDENTITY и не мудрить!

P.S
Давно тут не был...


Sirik писал(а):Авто нельзя, поле не уникальное.

хотя как такое может быть не ясно
I Have Nine Lives You Have One Only
THINK!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Дублирующие записи

Сообщение alibek » 05.03.2019 (Вт) 9:32

identity само по себе не гарантирует уникальность.
Для уникальности нужен constraint или uniquie index.
А identity просто упрощает работу с таблицей.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList