C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ADOQuery, Row cannot be located for update
gvg
Отправлено: 13.12.2005, 18:43


Машинист паровоза

Группа: Участник
Сообщений: 222



MS SQL
Делаю выборку с помощью ADOQuety из каких-либо таблиц. Смотрю результат в DBGrid. Перемещаюсь с записи на запись. Получаю в некоторый момент:
"Row cannot be located for update. Some values may have been changed since it was last read".
Что за хрень? Мне до лампы, что там менялось в таблицах, я работаю с выборкой...
Gedeon
Отправлено: 14.12.2005, 08:32


Ветеран

Группа: Модератор
Сообщений: 1742



Серверный курсор наверное стоит?
AVC
Отправлено: 14.12.2005, 09:14


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Мне до лампы, что там менялось в таблицах, я работаю с выборкой...

А зря, однако. Во первых update делается таки в таблице, а во вторых так возникают "потерянные изменения".
gvg
Отправлено: 14.12.2005, 09:14


Машинист паровоза

Группа: Участник
Сообщений: 222



Да нет, clUseClient. Ладно, вывернусь как-нибудь. Кстати, где по-русски можно почитать про эти ADO-шные параметры (CursorLocation, CursorType, LockType, MarshalOptions)? А то хрен поймешь, в чем разница...
Kuks
Отправлено: 14.12.2005, 09:32


Станционный диспетчер

Группа: Участник
Сообщений: 108



[QUOTE]Кстати, где по-русски можно почитать про эти ADO-шные параметры (CursorLocation, CursorType, LockType, MarshalOptions)?

В Архангельском.....
Gedeon
Отправлено: 14.12.2005, 09:49


Ветеран

Группа: Модератор
Сообщений: 1742



Ну, первое что напрашивается поставить на таблицу ReadOnly.

По поводу почитать по русски, из русского хэлпа Архангельского:
QUOTE

В компонентах наборов данных ADO TADOTable
, TADOQuery, TADOStoredProc, TADODataSet имеется два свойства, характеризующие курсор, используемый при навигации по таблице. Одно из них — CursorLocation определяет, какую библиотеку использует курсор при соединении с базой данных: клиентскую или сервера. Значение clUseClient (по умолчанию) обеспечивает большую гибкость. Все данные располагаются на компьютере — клиенте и тут же обрабатываются. При этом возможны операции сортировки и другие, которые могут не поддерживаться сервером. Впрочем, предложения SQL и в этом случае выполняются на сервере и на компьютер клиента передаются уже отобранные данные, соответствующие условию WHERE предложения SQL.
Значение свойства CursorLocation, равное clUseServer, желательно использовать в командах, возвращающих большой объем данных. В подобных случаях использование клиентского курсора может потребовать недопустимых затрат дискового пространства клиента.

Другое — CursorType описывает иные характеристики курсора. Это свойство может иметь значения:

ctUnspecified Тип курсора не определен.
ctOpenForwardOnly Курсор может перемещаться по таблице только вперед. Этот тип курсора повышает производительность приложения.
ctKeyset При этом типе курсора записи, добавленные другими пользователями, невидимы, а записи, удаленные другими пользователями, недоступны. Этот тип используется по умолчанию.
ctDynamic Этот тип динамического курсора обеспечивает видимость всех изменений, сделанных другими пользователями: модификаций, удалений, вставок. Курсор может перемещаться по таблице вперед и назад.
ctStatic Этот тип статического курсора обеспечивает копирование записей. Изменения данных, сделанные другими пользователями, невидимы.
Свойство MarshalOptions определяет, какие именно записи возвращаются на сервер, если при работе используется клиентский курсор. При значении MarshalOptions = moMarshalAll (значение по умолчанию) на сервер возвращаются все записи, считанные в локальный набор записей клиента. При значении MarshalOptions = moMarshalModifiedOnly на сервер возвращаются только измененные записи.
Свойство CacheSize указывает, сколько записей заносится в локальный буфер оперативной памяти. По умолчанию CacheSize = 1. Если задать, например, CacheSize = 10, то при открытии базы данных в буфер загрузятся первые 10 записей. Пока будет идти работа с этими записями, все операции будут проводится в оперативной памяти без обращения к базе данных. Если указатель таблицы вышел за пределы 10, то в память загрузятся следующие 10 записей и т.д. Естественно, что буферизация записей повышает эффективность работы.


Я же приводил ссылку, качайте и читайте.

Отредактировано Gedeon — 14/12/2005, 09:54

Вернуться в Работа с базами данных в C++Builder