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

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

Кеш базы??? [D7, XP]


Кузьмич ©   (2015-06-29 13:18:00) 

Всем доброго времени суток! Столкнулся с одной непоняткой.
Юзаю Firebird 2.5, пишу инфу в базу хранимками. Например в поле MyField(Numeric 15/2) базы начальное значение: 1 Читаю в проге,вижу 1. Потом пишу значение 2,сразу после записи читаю и вижу прежнее, тоесть 1. Но IBExpert показывает в это время что 2 успешно записалось. Затем для теста делаю по другому,читаю и вижу 1,пишу 2,connect=false,connect=true снова читаю и вижу 2 как и должно быть. В чем может быть трабла?


Кузьмич   (2015-06-29 16:13:00) [1]

Понятно что ничего не понятно... ((


кгшзх   (2015-06-29 16:08:00) [2]

ты слушай бразера. он в курсе причины.
и не нервный аноним.


brother   (2015-06-29 15:50:00) [3]

да не обращай внимания, он у нас нервный аноним... бывает...


Кузьмич   (2015-06-29 15:46:00) [4]

Только начал осваивать SQL, по ссылке кгшзхне совсем понятна причина проблемы. Если можно обьясните подробнее. Спасибо!


кгшзх   (2015-06-29 15:41:00) [5]

http://delphimaster.ru/cgi-bin/forum.pl?id=1435321941&n=18


Кузьмич   (2015-06-29 15:24:00) [6]

Хранимка:

begin
 if (:fin_id < 0) then
 begin
   insert into MyTable(MyField)
   values (:FIN_MyField);
 end
 else
 begin
   update
     MyTable
   set
     MyField=:FIN_MyField
   where
     id = :fin_id;
 end
end

Пишу в проге своей процедурой:

procedure RecordData(r:Real;sid:String);
begin
try
   with DataModule1.IBQuery1 do
   begin
   SQL.Text := 'execute procedure PROCMYTABLE(' + sid +',:Name_param1)';
   DataModule1.IBQuery1.ParamByName('Name_param1').Value :=r;
   if not Transaction.Active then Transaction.StartTransaction;
   ExecSQL;
   Transaction.Commit;
   Transaction.Active := false;
   end;
 except
   on E: Exception do
   begin
     if DataModule1.IBQuery1.Active then DataModule1.IBQuery1.Transaction.Rollback;
     Application.MessageBox(PChar(E.Message), 'Ошибка отката данных', MB_ICONERROR);
   end;
 end;
end;

К IBQuery1 прикручен IBTransaction(DefaultAction=TACommit)
В sid передаю нужный ID, в r нужное значение

Читаю сразу после записи с помощью IBQuery так: select MyField from MyTable
ParamChek=True

Что делаю не так? Может IBQuery1.Close в начале процедуры нужен?


кгшзх   (2015-06-29 14:30:00) [7]

http://delphimaster.ru/cgi-bin/forum.pl?id=1435321941&n=18


Ega23   (2015-06-29 14:00:00) [8]


> сразу после записи читаю и вижу прежнее, тоесть 1


В пишущей транзакции - будет 2. В другой, будет 1 до коммита пишущей, после будет 2. В случае отката пишущей - значение не изменится.


>  Но IBExpert показывает в это время что 2

Значит где-то между записью в твоей транзакции и чтением в IBExpert произошёл коммит.


brother   (2015-06-29 13:20:00) [9]

комит?


Наверх

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