Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транзакции [D5, Paradox]


Страницы:   1 2

ka ©   (2004-05-19 17:10:00) 

Приветствую.
Нужно удалить строку из одной таблицы и добавить строку в другую таблицу в рамках одной транзакции. Я делаю это так:

DataBase1.StartTransaktion
try
…
…
…
DataBase1.Commit;
except
DataBase1.RollBack;
end;

Все бы хорошо, но после того как я проверил как же работают транзакции, я увидел, что в моем варианте они вообще не работают.
Я благополучно удалил строку из одной таблицы (проверил физически из файла таблицы строка удалилась, я думал что этого быть не должно) вызвал ошибку произошел откат - DataBase1.Rollback, а в таблице удаленная строка не появилась. В чем дело? Я подумал может дело в кэшировании страниц, добавил  DataBase1.ApplyUpdates(…),DataBase1.CanselUpdates(…) убрал DataBase1.StartTransaktion, DataBase1.Commit, DataBase1.RollBack. Да еще включил Query.CashedUpdates.
Вот.
В чем я протуканил?


ka   (2004-05-19 19:07:00) [1]

Все равно спасибо всем кто помог.


ka   (2004-05-19 18:33:00) [2]

А что такое FireBird и где ее взять.


Соловьев   (2004-05-19 18:30:00) [3]


> [19] ka ©   (19.05.04 18:28)

если хочешь нормальные транзакции и бесплатно - [9]


ka   (2004-05-19 18:28:00) [4]

Я же серьезно :-(((
Я никогда не писал базы данных до самой этой пурги. Вот и вляпался.


Johnmen   (2004-05-19 18:25:00) [5]

>на что менее болезнено можно перети.

Соловьев ©   (19.05.04 17:57) [9]

Хотя болевой попрог у каждого свой...:)


Mike Kouzmine   (2004-05-19 18:24:00) [6]

FB


ka   (2004-05-19 18:23:00) [7]

Как это нет. Елки палки - так это все полная лажа. Заечем вообще придумали парадокс.
Тогда следующий вопрос: на что менее болезнено можно перети.


Mike Kouzmine   (2004-05-19 18:18:00) [8]

Там эмуляция. Таблицы не должны открываться, закрываться в течении всей транзакции. Иначе не работает. Вот как быть с ExecSql? Я не пробовал. Работает ли с запросами? Может для каждого запроса надо использовать свой TQuery?


Соловьев   (2004-05-19 18:12:00) [9]


> [13] ka ©   (19.05.04 18:10)

потому что в парадоксе их нет :)


ka   (2004-05-19 18:10:00) [10]

Да нет при проектировании все нормально суть же не в этом. Мне нужно узнать почему же у меня не работали транзакции.


Johnmen   (2004-05-19 18:04:00) [11]

>выбирается конкретный товар и переносится из таблицы проданных
>товаров в таблицу на складе.

Т.е. сначала продали, а потом вернули ? :)
Я думаю глобальная проблема - неточности при проектировании БД. В данном случае надо бы сделать так, чтобы переброска товара заключалась в UPDATE нужной записи в соответствующей таблице.


ka   (2004-05-19 18:01:00) [12]

Да самое ужасное, что не только начал, начал уже давно, и сделано уже много. А что так все запущено с этим парадоксом?? :-(


Курдль   (2004-05-19 17:59:00) [13]


> ka ©   (19.05.04 17:55) [8]
> Дело в том, что это обмен товара в БД магазина. То есть
> выбирается конкретный товар и переносится из таблицы проданных
> товаров в таблицу на складе. Поэтому и построчно.

Про зарплату "построчно" - это я о размере кода.
А "перенос товара на склад" - это нонсенс достойный орешника!
А не достаточно было "носить" ID-шник одной записи? :)


Соловьев   (2004-05-19 17:57:00) [14]


> Да еще БД локальная.

Пока только начал уйди нафиг ты с этого парадокса- скачай FireBird и разберись с ним.


ka   (2004-05-19 17:55:00) [15]

Дело в том, что это обмен товара в БД магазина. То есть выбирается конкретный товар и переносится из таблицы проданных товаров в таблицу на складе. Поэтому и построчно.


Курдль   (2004-05-19 17:49:00) [16]


> ka ©   (19.05.04 17:35) [3]

Вы зарплату получаете "построчно", как журналист?  :)


ka   (2004-05-19 17:48:00) [17]

Генерации для исключения здесь нет. Она была после удаления записи о продажи.
Да еще БД локальная.
Когда я включал CashedUpdates в файле таблицы после удаления запись удалялась. А почему? Ведь это должно было случиться только после ApplyUpdates?


Курдль   (2004-05-19 17:42:00) [18]


> Процедура выполняющая обмен товара - подробно. (Здесь без
> CashedUpdates)

А почему? Мне кажется, что это бы решило все проблемы.


Reindeer Moss Eater   (2004-05-19 17:38:00) [19]

Ну и где здесь генерация исключения для прерывания транзакции?


ka   (2004-05-19 17:35:00) [20]

Процедура выполняющая обмен товара - подробно. (Здесь без CashedUpdates)
procedure TfExchange.DoReturn;
var i,SysNo,code:longword;
SL:TStringList;
sSizes,sProcure_price,sReception_date,sBat:string;
begin

DataBase1.StartTransaction;
try
 SL := TStringList.create;
 i := choiserow - 1;
 SysNo := Query1.FieldByName('pSysNo').AsInteger;
 code := Query1.FieldByName('trCode').AsInteger;
 sSizes := Query1.FieldByName('trSize').AsString;
 sProcure_price :=Query1.FieldByName('trProcur_price').AsString;
 sReception_date :=Query1.FieldByName('trReception_date').AsString;
 sBat :=Query1.FieldByName('trBat').AsString;

 if i >= 0 then
 begin
   //Удалить запись о продаже из таблицы продаж.
   SL.Clear;
   SL.Add('DELETE FROM '+ tradetableex);
   SL.Add('WHERE trCode = '+IntToStr(code));
   querysql(SL,true);

   //Добавить в таблицу размеров запись.
   SL.clear;
   SL.Add('INSERT INTO ' + sectablenameex);
   SL.Add('(sSysNo,sSizes,sProcure_price,sReception_date,sBat)');
   SL.Add('VALUES');
   SL.Add('(' + '"'+ IntToStr(SysNo) + '", "'+ sSizes+ '",');
   SL.Add('"'+ sProcure_price +'", "'+sReception_date+'" ,"'+sbat+'");');
   querysql(SL,true);
 end;
DataBase1.Commit;

except
 on EO:Exception do
 begin
   DataBase1.Rollback;
   MessageDlg('Ошибка при работе с базой данных. Возврат не выполнен.'
     + #13#13 +  EO.Message ,mtError,[mbOk],0);
 end;
end
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо