Форум: "Базы";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
ВнизКак сделать Refresh для одной записи? Найти похожие ветки
← →
Antoxa2005 (2007-10-16 16:22) [0]Подскажите, как можно сделать Refresh, дл одной записи ч-з ADO?
Т.к. при большем объеме процедура занимает много времени...
Через FIB, вроде Refresh и обновляет одну запись, а с ADO как быть?
Т.е. есть открытый набор данных в DBGrid-е, через ADOQuery1(SELECT * FROM table1)
ADOCommand выполняет UPDATE Table1 SET fa=1 WHERE ID=ADOQuery1["ID"], а вот затем необходимо обновить ADOQuery, но не вест, а только текущую строку...
Как же это сделать???
← →
Правильный_Вася (2007-10-16 17:03) [1]и какой смысл обновления из БД, если ты и так имеешь в датасете актуальные данные по строке?
← →
Val © (2007-10-16 23:14) [2]>Правильный_Вася
с чего ты взял?
← →
turbouser © (2007-10-17 00:25) [3]
> Val © (16.10.07 23:14) [2]
А что не так? Данные у автора и так в контексте одной транзакции
(да, можно использовать извращенные уровни изоляции, но автор
надеюсь далек от этого, иначе ССЗБ)
Так что он имеет на клиенте всегда актуальные данные относительно этого
клиента и даже в FIB нельзя получить данные вне контекста текущей
транзакции в датасет.
← →
Antoxa2005 (2007-10-17 03:31) [4]Но ADOQuery не знает, что поле fa изменилось??? Поэтому в Grid-е видно старое значение fa, а как обновить информацию по записи, не обновляя весь набор данных???
← →
turbouser © (2007-10-17 03:48) [5]
> <Цитата>
>
> Antoxa2005 (17.10.07 03:31) [4]
>
> Но ADOQuery не знает, что поле fa изменилось???
Почему не знает? Кто изменял? Дядя с херсона??
← →
ЮЮ © (2007-10-17 04:02) [6]> Т.е. есть открытый набор данных в DBGrid-е, через ADOQuery1(SELECT
> * FROM table1)
>
> ADOCommand выполняет UPDATE Table1 SET fa=1 WHERE ID=ADOQuery1["ID"],
>
> Но ADOQuery не знает, что поле fa изменилось
Изменять следует именно в TADOQuery, которое и пошлет само на сервер запрос типа
UPDATE Table1 SET fa=1, .... WHERE ID=:OLD_ID
← →
Antoxa2005 (2007-10-17 04:16) [7]ЮЮ, а можно поподробнее? Ведь чтобы выполнить в TADOQuery коммнду UPDATE Table1 SET fa=1, .... WHERE ID=:OLD_ID, сначало надо ADOQuery.Close, затем поменять комаду SELECT... на UPDATE..., а затем, чтобы увидеть набор данных, опять close, SELECT... и open, т.е. опять же перезагрузка всех записей???
← →
ЮЮ © (2007-10-17 09:10) [8]ADOQuery.Edit;
ADOQuery.FieldByName["fa"].asInteger := 1;
ADOQuery.Post;
Это и без твоего вмешательства породит отправку на сервер команды UPDATE ... со значениями, соответствующеми измененной строки ADOQuery.
← →
ЮЮ © (2007-10-17 09:13) [9]Если же редактировать в DB Aware-компоненте (например в TDBGride), то и восве не нужно ни одной стрчки кода для внесения изменеиий в БД - просто пользователь меняет в гриде.
← →
Маша Шрайбер © (2007-10-17 10:11) [10]см. F1 про метод Requery у TADOQuery.
← →
ЮЮ © (2007-10-17 10:23) [11]>
>
> [10] Маша Шрайбер © (17.10.07 10:11)
> см. F1 про метод Requery у TADOQuery.
Сколько не смотри, он переоткрывает ВЕСЬ набор данных, чего, собственно, автор хочет избежать.
Requery updates the dataset by re-executing the original command or SQL statement that produced the recordset.
The effects of Requery are the same as calling the dataset’s Close method and then its Open method.
← →
Маша Шрайбер © (2007-10-17 10:42) [12]>> ЮЮ © (17.10.07 10:23) [11]
Либо Requery по-разному реализовано у TADOQuery и TADODataSet
либо вы не там смотрели
← →
ЮЮ © (2007-10-17 10:46) [13]>
>
> [12] Маша Шрайбер © (17.10.07 10:42)
> >> ЮЮ © (17.10.07 10:23) [11]
>
> Либо Requery по-разному реализовано у TADOQuery и TADODataSet
По хелпу он един, ибо ревлизован у предка:
Requery method (TCustomADODataSet)
> либо вы не там смотрели
А что можно высмотреть, если смотреть по Вашему?
← →
Маша Шрайбер © (2007-10-17 10:53) [14]>> ЮЮ © (17.10.07 10:46) [13]
>> А что можно высмотреть, если смотреть по Вашему?
Очень замечательные особенности.
Своими словами не буду - позже процитирую. Сейчас Дельфи снесли злые сотрудники :)
← →
Antoxa2005 (2007-10-17 12:20) [15]Начина с Delphi 7, у метода Requery, появились параметры, но нигде не могу про них почитать???
← →
Antoxa2005 (2007-10-17 14:59) [16]Ну, что, никак не сделать???
← →
Маша Шрайбер © (2007-10-17 15:40) [17]Экий вы нетерпеливый. Справку по Requery почитали? сюда можете кинуть?
← →
Antoxa2005 (2007-10-17 15:56) [18]Я не могу ее найти в D7... Помогите..?
← →
Маша Шрайбер © (2007-10-17 16:09) [19]Помогу. Но вечером. Или завтра.
← →
Antoxa2005 (2007-10-17 16:23) [20]Спасибо Машенька...
← →
Маша Шрайбер © (2007-10-17 19:58) [21]>> Antoxa2005
Так вот, господин ЮЮ © в своем посте [11] не все договорил. Почему - не знаю :)
Текст из F1 про Requery целиком :Refreshes the recordset.
Delphi syntax:
procedure Requery(Options: TExecuteOptions = []);
C++ syntax:
void __fastcall Requery(TExecuteOptions Options = TExecuteOptions());
Description
Call Requery to refresh the recordset. Requery updates the dataset by re-executing the original command or SQL statement that produced the recordset.
The effects of Requery are the same as calling the dataset’s Close method and then its Open method. However, there are circumstances when one means of refreshing the recordset is better than the other. The values in properties like CursorLocation, CursorType, and LockType cannot be changed while the dataset is open, so Requery can only refresh the recordset using the existing values in these properties. To refresh the recordset using different values for these properties, effect the refresh using the Close and Open methods.
Options is a TExecuteOptions value that specifies the characteristics of the command execution affected by the requery that produces the recordset for the dataset.
← →
ЮЮ © (2007-10-18 03:47) [22]> Так вот, господин ЮЮ © в своем посте [11] не все договорил.
> Почему - не знаю :)
И чего такого я там не договорил?.
Что между Close и Open ещё можно можно изменить CursorLocation, CursorType, and LockTypе, т.е. повторно открыть с другими характеристиками, в то время как Requery обновляется с теми же значениями этих параметров.
> Начина с Delphi 7, у метода Requery, появились параметры,
> но нигде не могу про них почитать???
TExecuteOptions values specify the characteristics of an execution operation.Unit
ADOdb
Delphi syntax:
type
TExecuteOption = (eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking, eoExecuteNoRecords);
TExecuteOptions = set of TExecuteOption;
C++ syntax:
enum TExecuteOption { eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking, eoExecuteNoRecords };
typedef Set<TExecuteOption, eoAsyncExecute, eoExecuteNoRecords> TExecuteOptions;
Description
When executing a command or connection using a method, use TExecuteOptions values to specify the characteristics of the execution operation. When reacting to a command or connection execution in an event handler, read the execute options parameter to determine the options already established for the connection triggering the event.
TExecuteOptions consists of the constants summarized in the following table:
Execute Option Meaning
eoAsyncExecute The command is executed asynchronously.
eoAsyncFetch The command fetches remaining rows after the initial quantity specified in the Cache property asynchronously.
eoAsyncFetchNonBlocking Execution is performed without blocking the thread.
eoExecuteNoRecords A command or stored procedure that does not return. If any rows are retrieved, they are discarded and not returned.
Возможно синхронное (eoAsyncExecute) выполнение запроса и снимет видимую задержку при переоткрытии НД.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c