Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2009, 14:39   #1
dalien
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 17
По умолчанию блокировка таблицы при одновременном доступе

Добрый день всем форумчанам. Начну с описания проблемы.
Есть БД, сервер MSSQL. доступ к таблицам БД Осуществляется через ADOConnection, связь с таблицами-ADOTable.
Имеется таблица contract.В неё пользователи вносят данные по договорам.Добавление записей происходит следующим образом:После нажатия на кнопку "сохранить" указатель перемещаем на последнюю запись таблицы,считываем id этой строки(id_contract),и прибавляем +1 к следующей(код приведен ниже)..Возникла ситуация,когда несколько пользователей одновременно считали этот id,и хотят сохранить свои данные.У пользователей возникла ошибка доступа к данным (duplicate primary key....).Как я понял,сервер не может внести данные с повторяющимся id (т.к. это поле ключевое).Как исключить эту проблему,чтобы на момент считывания id_contract и выполнения post одного пользователя,другие не смогли считать этот id и добавить свои данные.
Извините,если коряво написано.
С уважением,dalien

Код:
//регистрация договора
procedure TForm1.SpeedButton4Click(Sender: TObject);
var i,j:integer;
tmp:string;
begin
        DM.contract.Active:=true;
        DM.contract.Open;
        DM.contract.Last;
        i:=DM.contract.FieldByName('id_contract').AsInteger;
        DM.contract.Insert;
        DM.contract.FieldByName('id_contract').AsInteger:=i+1;
        DM.contract.FieldByName('contract_number').AsString:=edit5.Text;
        DM.contract.FieldByName('contract_subject').AsString:=trim(edit7.Text);
        DM.contract.Post;
        DM.contract.Active:=false;
        DM.contract.Close;
      
Application.MessageBox('Данные сохранены','Сообщение',MB_ICONASTERISK);
end;
dalien вне форума Ответить с цитированием
Старый 12.08.2009, 16:06   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а в МССКЛ раве нет что-то наподобие сиквенсов/генераторов?
soleil@mmc вне форума Ответить с цитированием
Старый 12.08.2009, 16:11   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Новый ИД вам нигде не требуется, судя по всему, так почему бы не объявить поле id_contract как identity и пусть СУБД сама думает как это сделать?
Генераторов с скюле до последнего времени вроде бы не было. Может там в 2005 каком-нибудь и появились. Ну это можно протестить запросом "create sequence tryam"
В стандарте SQL за 2003 год вроде бы только sequence описаны.

Последний раз редактировалось pu4koff; 12.08.2009 в 16:15.
pu4koff вне форума Ответить с цитированием
Старый 12.08.2009, 16:44   #4
dalien
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 17
По умолчанию

спасибо,попробую
dalien вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Run-time error 1004 для метода Unprotect при общем доступе Chelentano Microsoft Office Excel 2 11.08.2009 16:57
Макрос не отрабатывает копирование при общем доступе к книге Chelentano Microsoft Office Excel 6 07.08.2009 20:17
Ошибка при создании таблицы LAGOX SQL, базы данных 1 28.03.2009 00:46
Сертификат безопасности при доступе к web-узлу ss@sh Microsoft Office Excel 0 01.10.2008 15:49