При использовании функций SQL pass-through для обновления данных на удаленном сервере, вы управляете процессом - будут ли данные обновлены или нет, а также подробностями процесса обновления, установкой свойств курсора набора результатов. Visual FoxPro проверяет эти свойства при запросе на обновление до подтвеждения обновления.

NoteСовет

Курсоры представления SQL pass-through не являются обновляемыми до тех пор, пока вы не определите свойств обновления для курсора представления. Если вы желаете сохранить на постоянной основе установки свойств обновления, создайте определение представления. Visual FoxPro поставляет значения по умолчанию, которые подготавливают представление для перевода его в обновляемое, во время создания представления с помощью View Designer (Конструктора представления) или с помощью команд и функций языка. Вы можете использовать функцию CURSORSETPROP() для ввода дополнительной информации для подстановки или настройки значений по умолчанию.

Для обновления удаленных данных вы должны с помощью функции CURSORSETPROP() установить перечисленные ниже свойства:

Вы можете указать дополнительные свойства, такие как Buffering, UpdateType и WhereType для лучшего согласования с требованиями вашего приложения.

Свойства обновления, которые вы устанавливаете для курсора представления, слегка отличаются по именам, по сравнению с их аналогами в DBSETPROP( ) . Приведенная ниже таблица перечисляет имена, используемые как определений представлений, так и активных курсоров.

Свойства обновления для представления и курсора
Назначение Свойства определения представления 1 Свойста активного курсора 2

Сделать удаленные таблицы обновляемыми.

Tables

Tables

Указать удаленные имена для полей представления.

UpdateName (field-level property)

UpdateNameList

Указать поля представления, которые вы желаете использовать в качестве ключей.

KeyField (field-level property)

KeyFieldList

Указать поля представления, которые являются обновляемыми.

Updatable (field-level property)

UpdatableFieldList

Посылать обновления.

SendUpdates

SendUpdates

1 Устанавливается с помощью DBSETPROP().

2 Устанавливается с помощью CURSORSETPROP().

Для получения более подробной информации об установке свойств обновлений смотрите описания задач Как: обновить данные в представлении или смотрите описания функций DBSETPROP() или CURSORSETPROP().

Управления интервалами удаленных обновлений

Вы управляете тем, как буферируются обновления удаленных данных, установкой свойства Buffering курсора. Из пяти возможных режимов буферизации для удаленных представлений доступны два:

  • 3, или DB_BUFOPTROW, используется по умолчанию, который оптимистически блокирует строку.

  • 5, или DB_BUFOPTTABLE, который оптимистически блокирует таблицу.

Visual FoxPro поддерживает только оптимистическую блокировку удаленных курсоров.

NoteЗамечание

Установки пессимистического буферирования строки и таблицы, 2 и 4, не применяются для удаленных представлений, поскольку Visual FoxPro не производит блокировки данных на сервере. Установка свойства Buffering равная 1 не применяется к удаленным представлениям, поскольку представления всегда буферированы.

Использование оптимистической буферизации строки

Установка по умолчанию для буферизации, DB_BUFOPTROW, оптимистически блокирует удаленные данные на основе строка-за-строкой. Например, если вы желаете, чтобы изменения в таблице titles были подтвеждены на основе строка-за-строкой, например при использовании команды SKIP, вы должны установить свойство Buffering в 3:

 CopyCode imageСкопировать код
CURSORSETPROP('buffering', 3, 'titles')

Когда Buffering установлено в буферирование строки, то у вас есть два метода посылки обновлений на удаленный сервер. Вы можете:

  • Вызвать функцию TABLEUPDATE().

  • Использовать команду, которая перемещает указатель записи за ее пределы, такую как SKIP или GO BOTTOM.

Функция TABLEUPDATE( ) обновляет серверные данные без перемещения указателя записи. Команды, которые перемещают указатель записи посылают обновления на удаленный сервер так как это предусмотрено продуктом - перемещением указателя записи за пределы измененой записи.

Если вы используете буферирование строки и желаете иметь возможность отменять изменения сделанные в записях, вы должны обернуть изменения в ручные транзакции с помощью функций транзакции SQL pass-through.

Использование оптимистической буферизации таблицы

Если вы желаете, чтобы изменения были подтвеждены однократным пакетом обновления, например, когда пользовать щелкает по командной кнопке Save или OK в форме, вы можете использовать установку свойства Buffering равную 5, или DB_BUFOPTTABLE. Для посылки обновления на сервер вы долнжы вызвать фукнцию TABLEUPDATE().

В приведенном ниже примере, вы установливаете свойство Buffering в коде инициализации формы и затем подтвеждаете изменения в коде save.

Код Комментарии

CURSORSETPROP('buffering', 5, 'sqltitles')

Установка в коде Init

* Update batched changes;

* ignore changes made by others

 

TABLEUPDATE(.T., .T., 'titles')

Установка в  коде Save

Для восстановления оригинальных значений в таблице и предотвращения посылки обновлений удаленному серверу, вы вызываете TABLEREVERT(). Вы можете управлять объемом отката - будет ли откат произведен для одной или всех строк комбинированием установок свойства Buffering курсора и команды TABLEREVERT(). В приведенном ниже примере откатывается только текущая строка. Вы можете пожелать вызвать такой код, когда пользователь щелкает в форме по командной кнопке Cancel:

 CopyCode imageСкопировать код
= TABLEREVERT(.F., 'titles')      && Откатывает изменения в текущей строке

Если вы желаете откатить изменения во всех строках, например, когда пользователь нажмет ESC для выхода из формы, вы можете использовать этот же самый пример, который в данном случае изменяет установку свойства Buffering и команду TABLEREVERT() для отката изменений во всех строках, с помощью буферизации полной таблицы:

 CopyCode imageСкопировать код
= TABLEREVERT(.T., 'titles')      && Откатывает изменения во всех строка

Для получения более подробной информации о буферировании смотрите описание  Программирование для совместного доступа.

Определение изменений, сделанных другими пользователями

В многопользовательских приложениях, конфликты с обновлениями других пользователей определяются с помощью запросов SQL Update, который генерируется, когда производится локальная попытка записи. Уровень определения зависит от установки свойства WhereType. Для получения более подробной информации об установке свойства WhereType смотрите описание Управление обновлениями с помощью представлений.

Принуждение обновлений

Вы можете использовать функцию TABLEUPDATE() для контроля - были ли изменения, сделанные в таблице или курсоре другим пользователем в сети переписаны посылкой ваших обновлений. Если вы установливаете параметр Force функции TABLEUPDATE( ) в true (.T.), а CURSORSETPROP() установить значение свойства UpdateType в значение по умолчанию, равное 1, старые данные обновляются новыми, которые вы посылаете, до тех пор, пока ключевое поле записи в удаленной таблице остается неизменным. Если значение ключевого поля изменилось, или если значение свойства UpdateType установлено в 2, Visual FoxPro посылает удаленной таблице предложение DELETE до предложения INSERT.

Сообщения об ошибках при поиске конфликтов обновления

В приведенной ниже таблице перечислены сообщения об ошибках Visual FoxPro и ODBC, которые применяются именно для удаленных обновлений. Колонка Действие содержит описание действия, которое вы можете предпринять для разрешения конфликтного состояния.

Сообщение об ошибке Означает Действие

No update table(s) specified. Use the Tables cursor property.

Свойство курсора Tables не содержит имен удаленных таблиц. Для производства обновлений на удаленном сервере требуется по крайней мере хотя бы одна таблица.

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

No key column(s) specified for the update table table_name. Use the KeyFieldList cursor property.

Первичный ключ, указанный в сообщении об ошибке не включен в значение свойства KeyFieldList курсора; для каждой обновляемой таблицы требуется первичный ключ.

Используйте свойство KeyFieldList для указания первичного ключа удаленной таблицы.

No valid update table specified for column column_name. Use the UpdateNameList and Tables cursor properties.

Свойство UpdateName для колонки column_name имеет недопустимый идентификатор таблицы.

Установите идентификатор таблицы в свойстве UpdateNameList или добавьте его в свойство Tables или сделайте оба изменения.

The KeyField List cursor property doesn't define a unique key.

Более чем одна запись в удаленной источнике имеют один и тот же ключ.

Используйте свойство KeyField List property для определения уникального ключа для удаленной таблицы.

From ODBC: ODBC invalid object.

ODBC не может найти удаленную таблицу или поле, поскольку именованные не существуют. Имена полей Visual FoxPro проверяются им самим; удаленные таблицы и имена полей проверяются только на удаленном сервере.

Проверьте имя объекта.

Для получения более подробной информации об обработке ошибок смотрите описание Обработка ошибок SQL Pass-Through.

Смотрите также