|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.04.2010, 13:46 | #1 |
Регистрация: 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; .... а так я вообще не понял что он изменяет, но тоже не ту запись, которую нужно. Как сделать чтобы при одновременном обращении один из компов ждал а потом пытался снова изменить запись? |
27.04.2010, 20:51 | #2 |
Форумчанин
Регистрация: 15.06.2008
Сообщений: 271
|
А что именно за ошибка? Или это является коммерческой тайной?
Так как MS SQL Server является по сути "блокировочником", а не "версионником", то было бы, конечно, весьма полезно ознакомиться с механизмами транзакций и блокировок в данной СУБД. А также почитать про управление блокировками. В связи с этим обратить внимание на свойства IsolationLevel компонента ADOConnection и LockType датасета. И что значит: ? А что с приложением-клиентом? |
28.04.2010, 17:18 | #3 |
Регистрация: 25.04.2010
Сообщений: 6
|
MessageDlg('Одновременное обращение к одной и той же записи. Изменения не были внесены. Сканируйте снова.',mtInformation,[mbOK],0);
эта ошибка) если без try и except то чтото типа: Невозможно произвести добавление, потому что данные могли меняться со времени последнего чтения. только вместо EXIT после моего сообщения MessageDlg('Одновременное обращение к одной и той же записи. Изменения не были внесены. Сканируйте снова.',mtInformation,[mbOK],0); процедура выполняется дальше и из-за этого товар прибавляется из виртуального пространства) и на счет разобраться с сервером согласен) |
28.04.2010, 18:45 | #4 | |
Форумчанин
Регистрация: 15.06.2008
Сообщений: 271
|
Цитата:
Тогда такие варианты: 1) Первичные ключи есть во всех таблицах? Должны быть во всех. 2) Установи для свойства CursorLocation датасета значение - "clUseServer" 3) Ознакомься вот с этой статьей на delphikingdom. 4) Ну и, естественно, ознакомиться с механизмом транзакций и блокировок в MS SQL Server. Без этого, к сожалению, - никуда ... P.S. А вообще, если юзаешь MS SQL Server - то делай все через хранимые процедуры. Тогда забудешь про этот геморрой раз и навсегда. Последний раз редактировалось edgy; 28.04.2010 в 18:53. Причина: Добавил P.S. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |