Поиск:

Ответ в темуСоздание новой темы Создание опроса
> блокировка таблицы при одновременном доступе 
:(
    Опции темы
dalien
Дата 12.8.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



Добрый день всем форумчанам. Начну с описания проблемы.
Есть БД, сервер 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;


PM MAIL   Вверх
Akella
Дата 12.8.2009, 15:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(dalien @  12.8.2009,  13:47 Найти цитируемый пост)
 DM.contract.Close;


Цитата(dalien @  12.8.2009,  13:47 Найти цитируемый пост)
DM.contract.Active:=false;


это одно и то же

Добавлено через 3 минуты и 21 секунду
Цитата(dalien @  12.8.2009,  13:47 Найти цитируемый пост)
После нажатия на кнопку "сохранить" указатель перемещаем на последнюю запись таблицы,считываем id этой строки(id_contract),и прибавляем +1 к следующей(код приведен ниже)..Возникла ситуация,когда несколько пользователей одновременно считали этот id,и хотят сохранить свои данные.

 smile  smile  smile  smile  smile  smile  smile  smile  smile 
ты что-нить знаешь про autoincrement поля?

Добавлено через 4 минуты и 49 секунд
Цитата(dalien @  12.8.2009,  13:47 Найти цитируемый пост)
Как исключить эту проблему,

Получить хотябы начальные знания по типам полей, многопользовательской работе и вообще о БД.
PM MAIL   Вверх
dalien
Дата 12.8.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



читал,но видимо плохо(
PM MAIL   Вверх
former
Дата 12.8.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



dalien, срочно начинай изучать БД с нуля. Книг, статей с примерами в Интернете достаточно. Поддерживаю Akella.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
pseud
Дата 17.8.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(former @  12.8.2009,  17:22 Найти цитируемый пост)
dalien, срочно начинай изучать БД с нуля. Книг, статей с примерами в Интернете достаточно. Поддерживаю Akella.

поддерживаю и добавлю:
ADOTable - это зло
пользуй ADOQuery.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 17.8.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а ADODataSet?
PM MAIL   Вверх
pseud
Дата 18.8.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Akella @  17.8.2009,  21:29 Найти цитируемый пост)
а ADODataSet?


Цитата(pseud @  17.8.2009,  17:38 Найти цитируемый пост)
ADOTable - это зло


ну это я утрировал.
имею ввиду что зло:
Код

  ADODataSet1.Insert;
  ADODataSet1.FieldByName('xxx').AsString := 'xxx';
  ADODataSet1.Post;  

не зло:
Код

  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('insert into table1 (xxx) values (:p1)');
  ADOQuery1.Parameters.ParamByName('p1').Value := 'xxx';
  ADOQuery1.ExecSQL;

речь конечно идет о многопользовательских системах.

Добавлено через 11 минут и 43 секунды
Цитата(Vit @  24.4.2006,  22:42 Найти цитируемый пост)
Компонент TADOTable - не используется никогда и ни при каких ситуациях

Пост Виталия Невзорова (вечная память) отсюда:
Прежде чем спросить загляните сюда!


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 18.8.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(pseud @  18.8.2009,  09:35 Найти цитируемый пост)
имею ввиду что зло:
  ADODataSet1.Insert;
  ADODataSet1.FieldByName('xxx').AsString := 'xxx';
  ADODataSet1.Post;  

Почему ADODataSet - это зло?

Ну и вдогонку - почему TADOTable - это зло?
PM MAIL   Вверх
pseud
Дата 18.8.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



надо бы подискутировать, но нет возможности, вот нашел выдержку из чьей-то курсовой:
Цитата

   Какой компонент выбрать при разработке приложений баз данных  Table  или
Query? Ответ на этот вопрос не сложен. Если приложение  клиент –  серверное,
то однозначно целесообразней использовать  компонент  Query,  поскольку  во-
первых, он более гибок и гораздо мощнее  Table,  а  во-вторых  не  загружает
сеть, а если база данных  локальная, то во многих  случаях  можно   обойтись
Table, так как работа с ним гораздо проще и где  не  требуется  мощь  SQL  -
запросов он вполне может заменить Query.

От себя добавлю, что и в локальных БД (например, paradox) без мощи SQL не обойтись (я не обхожусьsmile). Как вспомню свою программу писаную 6 лет назад при помощи дурацкой книги недалекого автора по дельфи с этими TTable, так вздрогну. Чего стоит навигационный способ поиска по 3 000 записей и попытка работы нескольких юзеров с одной БД. Брррр.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 18.8.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Это и так понятно, что кверя гибче, так сказать и сеть меньше грузит за счёт фетча.
Но ADODataSet тоже ведь работает на запросах....

Добавлено через 55 секунд
Я с ADO очень мало работаю, можно сказать, что не работаю. Но мне кажется, что ADODataSet лучше, чем ADOQuery.

Добавлено через 1 минуту и 50 секунд
Так ещё есть же ADOCommand
PM MAIL   Вверх
pseud
Дата 18.8.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Akella @  18.8.2009,  15:28 Найти цитируемый пост)
Я с ADO очень мало работаю, можно сказать, что не работаю

аналогично ))
давай замнем для ясности ))


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 18.8.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



 smile Два спеца по ADO решили подискутировать  smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.