Поделиться через


Обнаружение конфликтов при удаленном доступе к данным и оповещение о конфликтах

Удаленный доступ к данным в Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) предусматривает механизм ограниченных сообщений о конфликтах для строк, которые во время принудительной отправки не удается обновить на компьютере с программным обеспечением SQL Server.

Важно!
При удаленном доступе к данным конфликтующие строки могут возникать только при сбое операции вставки, обновления или удаления, возникшем вследствие ошибки в процессе принудительной отправки данных из таблицы SQL Server Compact Edition в таблицу SQL Server. Изменения данных, сделанные различными пользователями, не приводят к конфликтам, если при этом не возникало ошибок.

Хотя удаленный доступ к данным не поддерживает механизм разрешения конфликтов (как это сделано при репликации), однако SQL Server Compact Edition содержит таблицу ошибок, в которой сохраняются конфликтующие строки. Таблица ошибок может быть указана как часть метода Pull. Все ошибки, возникшие во время принудительной отправки, сохраняются в этой таблице ошибок. Применение таблицы ошибок позволяет разрабатывать приложения для управления обнаружением конфликтов и оповещением о конфликтах.

Изменения, внесенные в базу данных SQL Server Compact Edition и принудительно отправляемые на сервер, сохраняются в том порядке, в котором они получены. Таблица SQL Server обновляется таким образом, чтобы сохранить изменения, внесенные последним пользователем.

При удаленном доступе к данным конфликт возникает в тех случаях, когда строка не может быть принудительно отправлена из базы данных SQL Server Compact Edition в базу данных SQL Server. Удаленный доступ к данным поддерживает только одноуровневое отслеживание. Поэтому (в зависимости от того, какие параметры выбраны в методе Push) некоторые строки могут быть переданы успешно, а при передаче других строк может возникать сбой. Чтобы отслеживать конфликты при удаленном доступе к данным, укажите в методе Pull перечислитель TRACKINGON или TRACKINGON_INDEXES.

Чтобы избежать конфликтов и ошибок при использовании таблиц, отслеживаемых удаленным доступом к данным, следует надлежащим образом выполнять фильтрацию таблиц и использовать при передаче данных надежное сетевое соединение.

Возникновение конфликтов при удаленном доступе к данным

Если внесенные в строку изменения не удается сохранить на сервере, это может происходить по следующим причинам.

  • Удаленный доступ к данным отслеживает операции вставки, обновления и удаления для каждой строки, которая была изменена в отслеживаемой таблице на устройстве. Поэтому в тех случаях, когда строка, вставленная на клиентском устройстве, имеет такой же первичный ключ, как строка, вставленная в эту же таблицу на сервере, в процессе принудительной отправки на сервер возникнет ошибка и произойдет сбой, поскольку вставляемое значение уже существует.
  • Если данные не были надлежащим образом секционированы для каждого пользователя, один пользователь может удалить строку, которую пытается обновить другой пользователь.
  • В процессе принудительной отправки данных на сервер могут возникать ошибки и происходить сбои, если предыдущая операция принудительной отправки была прервана. Например, пользователь начал принудительно отправлять на сервер данные, содержащие вставленные строки, и в процессе отправки сетевое соединение было разорвано. При этом клиент сообщает, что принудительная отправка не выполнена из-за разрыва сетевого соединения. Однако фактически изменения были сохранены на сервере. Когда сетевое соединение восстановится и пользователь попытается повторно отправить те же самые данные, некоторые строки не будут сохранены, поскольку они были вставлены во время предыдущей принудительной отправки. В этом случае приложение должно проигнорировать все ошибки в таблице ошибок, возникшие при повторной отправке вследствие обнаружения копий первичного ключа.

Таблицы ошибок

Удаленный доступ к данным отслеживает конфликты данных (строки, которые невозможно сохранить на сервере вследствие ошибок). Для этого возвращаются сообщения об ошибках, которые сохраняются в таблице ошибок базы данных SQL Server Compact Edition. Сообщения об ошибках записываются в таблицу ошибок вместе со строками, при сохранении которых произошел сбой. Эту таблицу необходимо определить в методе Pull. Если в дальнейшем при выполнении принудительной отправки возникнут ошибки, они будут сохранены в данной таблице ошибок.

Если при использовании метода Push строку невозможно будет сохранить на сервере из-за ошибки (например, из-за наличия на сервере такого же значения первичного ключа, как в сохраняемой строке), для разрешения строки нужно будет указать имя таблицы ошибок, определенной в методе Pull. Свойство ErrorTableName метода Pull указывает имя таблицы, в которой должны быть сохранены ошибки, возникшие в процессе принудительной отправки. Таблица ошибок создается сразу, однако сначала она является пустой. Свойство ErrorTableName может быть указано, только если в методе Pull указаны перечислители TRACKINGON или TRACKINGON_INDEXES.

Если ошибка возникает вследствие того, что при выполнении метода Push не удается сохранить строку, для каждой возникающей ошибки SQL Server Compact Edition вставляет запись в таблицу ошибок. Вместе со всеми столбцами базовой таблицы добавляются три дополнительных столбца, показывающие место и причину возникновения ошибки. Столбец s_ErrorDate содержит дату и время возникновения ошибки. Столбец s_OLEDBErrorNumber содержит код HResult ошибки, возникшей при сохранении строки на сервере. Столбец s_OLEDBErrorString содержит строку с описанием ошибки. Если во время выполнения метода Push при сохранении строк на сервере возникли ошибки, то после завершения данного метода приложение получит предупреждение (SSCE_WRN_RDAERRORROWSRETURNED, значение 28800) и сможет проанализировать таблицу ошибок, чтобы определить причины возникновения ошибок.

Поддержание таблицы ошибок

Таблицы ошибок автоматически удаляются при удалении сопоставленной им таблицы, отслеживаемой удаленным доступом к данным, даже если в таблице ошибок есть данные. Разработчик должен разрешить строки, вызвавшие конфликты, поскольку эти строки не могут быть сохранены на сервере.

Для устранения ошибки, возникшей в процессе принудительной отправки данных на сервер, может потребоваться обновить данные на устройстве. Рекомендуется выполнять кэширование данных, содержащихся в таблице ошибок, чтобы эти данные не были потеряны при удалении отслеживаемой таблицы. Также можно запросить обновленные данные и сохранить их в таблице, имя которой отличается от имени исходной отслеживаемой таблицы.

Устранение ошибок после принудительной отправки данных

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

Ошибки и непакетированные транзакции

При выполнении непакетированных транзакций (параметр BATCHINGOFF при использовании метода Push) конфликты обнаруживаются на уровне строк. Строка, вызвавшая конфликт, возвращается приложению и сохраняется в указанной таблице ошибок. Например, если приложение пытается принудительно отправить в базу данных SQL Server недействительную строку, эта строка возвращается приложению и сохраняется в таблице ошибок вместе с сообщением об ошибке, оповещающем о конфликте.

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

Удаление таблицы на устройстве приводит к удалению соответствующей таблицы ошибок. В этом случае данные из таблицы ошибок необходимо сохранить во временной таблице или повторно запросить данные с сервера и сохранить их в отдельной таблице. Поскольку строки, вызвавшие конфликт, удаляются из таблицы в базе данных SQL Server Compact Edition, необходимо повторно обновить таблицу и сохранить в ней правильные данные с сервера. Если вызвавшая конфликт строка была обновлена в исходной таблице, необходимо повторно обновить эту строку, чтобы последующая принудительная отправка выполнилась успешно. Если строка была обновлена, а соответствующая строка на сервере была удалена, то для того, чтобы вставка выполнилась успешно, необходимо добавить эту строку в таблицу и повторно выполнить принудительную отправку.

Ошибки и пакетные транзакции

Удаленный доступ к данным поддерживает пакетную принудительную отправку (параметр BATCHINGON при использовании метода Push). Чтобы пакетная принудительная отправка выполнилась полностью, необходимо, чтобы все строки были сохранены успешно. Если при сохранении хотя бы одной строки происходит сбой, вся транзакция принудительной отправки завершается неудачно и данные не обновляются. Строки, вызвавшие конфликт, копируются в таблицу ошибок. Корпорация Майкрософт рекомендует использовать именно этот режим, поскольку он несколько упрощает разрешение конфликтов. В отличие от непакетированной принудительной отправки, исходная база данных под управлением Microsoft Windows CE остается без изменений. Приложение должно быть разработано таким образом, чтобы пользователи могли исправить вызвавшие конфликт данные, а затем приложение могло сохранить эти данные в исходной базе данных под управлением Windows CE. Поскольку исходная строка не изменяется, то необходимость повторного запроса данных с сервера для определения правильного разрешения строки зависит от конкретной ошибки. Например, если сбой при сохранении строки произошел вследствие нарушения целостности, можно обновить строку на устройстве и вызвать метод Push для принудительной отправки данных на сервер. Этот вариант также позволяет выполнять очистку, поскольку перед копированием строки, вызвавшей конфликт, таблица ошибок автоматически очищается — в таблице ошибок хранятся только сведения о конфликтах, возникших при выполнении последней операции принудительной отправки.

См. также

Справка и поддержка

Получение помощи по SQL Server Compact Edition