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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2010, 13:46   #1
crocklam
 
Регистрация: 25.04.2010
Сообщений: 6
Стрелка ADO 2 компа и снова проблема с транзакциями

Всем привет!

У меня следующая проблема:

База данных, собранная в Access перенесена на MS SQL Server 2000
Я подключаюсь к ней с 2х компов одновременно с помощью компонента ADOConnection.

Когда происходит запись в одну и туже запись одной и той же таблицы одновременно с 2х компов появляется ошибка и данные не меняются.

Если сделать так то происходит тоже самое, только с моим сообщением.

ADOConnection.BeginTrans;
try


ADOSklad.Edit;
ADOSklad.FieldByName('Кол-во').AsInteger:=ADOSklad.FieldByNam e('Кол-во').AsInteger-kolvo;
ADOSklad.FieldByName('Сумма').AsCur rency:=ADOSklad.FieldByName('Цена') .AsCurrency*ADOSklad.FieldByName('К ол-во').AsInteger;
ADOSklad.FieldByName('Сумма поставщика').AsCurrency:=ADOSklad.F ieldByName('Цена поставщика').AsCurrency*ADOSklad.Fi eldByName('Кол-во').AsInteger;
ADOSklad.Post;

ADOConnection.CommitTrans;

except on E:Exception do
begin

ADOConnection.RollbackTrans;

SHCodeEdit.Clear;
MessageDlg('Одновременное обращение к одной и той же записи. Изменения не были внесены. Сканируйте снова.',mtInformation,[mbOK],0);

exit;
end;
end;


Как сделать чтобы если поподает в EXCEPT была попытка снова отправить транзакцию.

Пробовал так:

for i:=0 to 5 do
begin

ADOConnection.BeginTrans;
try

...
...
...
ADOConnection.CommitTrans;
break;
except on E:Exception do
begin

ADOConnection.RollbackTrans;


end;
end;
end;


так он изменяет первую строку вместо нужной в ADOSklad
Пробовал перед циклом запоминать номер строки, например:
var
RecN:int64;
....
RecN:=ADOSklad.RecNo;
for i:=0 to 5 do
begin

ADOConnection.BeginTrans;
try
ADOSklad.RecNo:=RecN;
....

а так я вообще не понял что он изменяет, но тоже не ту запись, которую нужно.

Как сделать чтобы при одновременном обращении один из компов ждал а потом пытался снова изменить запись?
crocklam вне форума Ответить с цитированием
Старый 27.04.2010, 20:51   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от crocklam Посмотреть сообщение
появляется ошибка и данные не меняются.
А что именно за ошибка? Или это является коммерческой тайной?

Так как MS SQL Server является по сути "блокировочником", а не "версионником", то было бы, конечно, весьма полезно ознакомиться с механизмами транзакций и блокировок в данной СУБД. А также почитать про управление блокировками. В связи с этим обратить внимание на свойства IsolationLevel компонента ADOConnection и LockType датасета.

И что значит:
Цитата:
Сообщение от crocklam Посмотреть сообщение
База данных, собранная в Access перенесена на MS SQL Server 2000
?
А что с приложением-клиентом?
edgy вне форума Ответить с цитированием
Старый 28.04.2010, 17:18   #3
crocklam
 
Регистрация: 25.04.2010
Сообщений: 6
По умолчанию

MessageDlg('Одновременное обращение к одной и той же записи. Изменения не были внесены. Сканируйте снова.',mtInformation,[mbOK],0);

эта ошибка)

если без try и except то чтото типа: Невозможно произвести добавление, потому что данные могли меняться со времени последнего чтения.

только вместо
EXIT
после моего сообщения
MessageDlg('Одновременное обращение к одной и той же записи. Изменения не были внесены. Сканируйте снова.',mtInformation,[mbOK],0);

процедура выполняется дальше и из-за этого товар прибавляется из виртуального пространства)

и на счет разобраться с сервером согласен)
crocklam вне форума Ответить с цитированием
Старый 28.04.2010, 18:45   #4
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от crocklam Посмотреть сообщение
Невозможно произвести добавление, потому что данные могли меняться со времени последнего чтения.
Вот с этого и надо было начинать...

Тогда такие варианты:
1) Первичные ключи есть во всех таблицах? Должны быть во всех.
2) Установи для свойства CursorLocation датасета значение - "clUseServer"
3) Ознакомься вот с этой статьей на delphikingdom.
4) Ну и, естественно, ознакомиться с механизмом транзакций и блокировок в MS SQL Server. Без этого, к сожалению, - никуда ...

P.S. А вообще, если юзаешь MS SQL Server - то делай все через хранимые процедуры. Тогда забудешь про этот геморрой раз и навсегда.

Последний раз редактировалось edgy; 28.04.2010 в 18:53. Причина: Добавил P.S.
edgy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADO с 2х компов, проблема с транзакциями Delphi crocklam БД в Delphi 4 25.04.2010 22:17
и снова проблема с treeview ser2031 Компоненты Delphi 8 15.11.2009 15:04
работа с транзакциями kate158 БД в Delphi 1 26.08.2009 15:49
проблема доступа к запароленной БД (ADO) azat БД в Delphi 5 20.09.2008 13:34
Проблема с параметрами при работе С ADO А. Долматов БД в Delphi 22 30.11.2007 08:47