![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
refresh в ибдатасет [D7, IB6.x]
stud © (2004-08-25 15:28:00)набор получаю с помощью хранимой процедурой, возможно ли в такой ситуации использовать метод refresh?
Vemer (2004-09-08 21:23:00) [1]Ха, наступил на те-же грабли.. при попытке refresh датасета посылают далеко и хорошо..
stud (2004-09-08 15:04:00) [2]и всетаки как работать с рефреш при использовании хранимых процедур? не хочет оно обновляться!!
Zacho (2004-08-26 20:05:00) [3]
> Vemer © (26.08.04 19:45) [21]
Да мало ли зачем. Например, для редактирования нужно выполнить несколько запросов, и/или запрос в отдельной транзакции.
Vemer (2004-08-26 19:45:00) [4]To Stud - А зачем IBSQL - ведь IBSDataset редактируемый набор. А если он висит на R/O транзакции - IBQuery ИМХО хватит.
Vemer (2004-08-26 19:42:00) [5]To -Sem-
Не путайте открытие/закрытие трензакции и датасета. Для Read Commited транзакции достаточно переоткрыть датасет. Саму тр-ю дергать не надо.
Zacho (2004-08-26 11:56:00) [6]-SeM- (26.08.04 11:45) [15]
Чего ради ??? Не путай read committed и snapshot
Про IL очень подробно написано здесь: http//www.ibase.ru/devinfo/ibtrans.htm
stud (2004-08-26 11:54:00) [7]Repeatable Read - воспроизводимое (или повторяемое) чтение. Транзакция видит только те данные, которые существовали на момент ее старта.
stud (2004-08-26 11:52:00) [8]
> -SeM- (26.08.04 11:45) [15]
read commited - читает подтвержденные транзакции. к моменту рефреш изменяющая транзакция уже подтверждена и все можно читать.
то что ты описал немного другие параметры должны быть.
-SeM- (2004-08-26 11:49:00) [9]
> те изменения, которые произошли после первого открытия.
Вернее так:
те изменения других транзакций, которые произошли после первого открытия.
Свои видны сразу
-SeM- (2004-08-26 11:45:00) [10]Zacho © (26.08.04 11:33) [14]
Что такое транзакция? Это снимок согласно параметрам. И то что она read commited означает, что она берет те записи, которые были подтверджены при открытиитранзакции. Закрой ее и открой вновь и только тогда увидишь те изменения, которые произошли после первого открытия.
Zacho (2004-08-26 11:33:00) [11]-SeM- (26.08.04 11:10) [13]
Все равно должно работать, ибо читающая транзакция - read commited.
-SeM- (2004-08-26 11:10:00) [12]stud © (26.08.04 10:20) [11]
> ibsql - работает в другой транзакции
Ты сам себе в ответил - они пользуются разными транзакциями
Zacho (2004-08-26 10:42:00) [13]Или все-таки пишущая транзакция не коммитится, или с запросом в RefreshSQL что-то не в порядке.
stud (2004-08-26 10:20:00) [14]1. действительно выполняется
2. изменения вносятся в текущую запись через ibsql, после чего выполняется refresh
параметры транзакции в рамках которой выполняется refresh
read
read_committed
rec_version
nowait
ibsql - работает в другой транзакции, которая нормально комитится.
после переоткрытия набора - все изменения видны
Zacho (2004-08-26 10:06:00) [15]Refresh должен нормально работать, неважно с ХП или нет.
Так что проверь:
1. Ты уверен, что RefreshSQL действительно выполняется ?
2. Ты уверен, что данные действительно меняются ? Может у тебя UpdateSQL не выполняется, а не Refresh.
stud (2004-08-26 09:37:00) [16]
> Кстати, самым простым будет просто написать в RefreshSQL
> Select * from Myproc where ID=:ID,
так оно и есть на самом деле, только рефреша не происходит.
> Vemer © (25.08.04 19:00) [6]
это конечно универсальный способ. но перетаскивать постоянно весь набор не есть хорошо, хотя в моем случае и не смертельно.
хочется просто разобраться какая специфика этих методов при работе с ХП, или они вообще в данном случае не применимы.
Evgeny V (2004-08-26 08:14:00) [17]Кстати, самым простым будет просто написать в RefreshSQL Select * from Myproc where ID=:ID, правда тогда хранимая процедура будет выбирать все записи, а уже из выборки мы возьмем только то что надо
Evgeny V (2004-08-26 07:25:00) [18]Не пробовал, но интересно порассуждать. Что бы рефрешить запись нам надо знать ее ID. Тогда если передавать в хранимую процедуру параметром ID записи и там соответственно его обрабатывать, вытаскивать только одну запись, то в принципе можно. Надо только что бы процедура анализировала параметр ID, если он задан, то искать по одной ветке, где делается скажем select * from table where id=:ParamId, если Id например задан 0 или NULL( как сказать процедуре, что надо все записи, вариантов может быть несколько, на ваше усмотрение), выполнять просто select * from table, в упрощенном варианте наверное так. В этом случае не потребуется переоткрывать весь датасет.
Vemer (2004-08-25 19:00:00) [19]Как вариант:
Procedure Refresh_MyDataset(My_Int:Varuant);
Begin
My_Dataset.Close;
My_Dataset.Open;
My_Dataset.Locate('Dataset_IDField',My_Int,[]);
End;
Использование:
Refresh_MyDataset(Dataset_IDField.Value);
Рефрешит с сохранением позиции курсора..
stud (2004-08-25 17:11:00) [20]проблемы такие, что запись не обновляется