Фильтрация MS Sync Framework - PullRequest
0 голосов
/ 07 августа 2009

Здравствуйте, фильтрация работает с последней версией Microsoft Sync Framework. поэтому я использовал фильтр, передаваемый от клиента к серверу

на сервере (sqlServer08 с включенным отслеживанием изменений) У меня

SqlParameter filterParameter = new SqlParameter ("@ Institution_ID", SqlDbType.UniqueIdentifier);

    string customerFilterClause = "Institution_ID=@Institution_ID";
    customerBuilder.FilterClause = customerFilterClause;
    customerBuilder.FilterParameters.Add(filterParameter);

а на клиенте у меня

SyncTable depsSyncTable = new SyncTable ("отдел"); depsSyncTable.CreationOption = TableCreationOption.DropExistingOrCreateNewTable; depsSyncTable.SyncDirection = SyncDirection.DownloadOnly;

        this.Configuration.SyncTables.Add(depsSyncTable);
        this.Configuration.SyncParameters.Add(
             new SyncParameter("@Institution_ID", new Guid("248a1343-decb-45a5-906f-2fa4d17f8d76")));

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

Вы можете помочь мне здесь? спасибо

Ответы [ 3 ]

1 голос
/ 10 июля 2010

Я только что столкнулся с этой проблемой. Он загружает все данные в первый раз и оттуда фильтрует, как и ожидалось. Но было уже слишком поздно, ненужные данные уже загружены.

Хотите поделиться, как вы решили это?

При выполнении трассировки синхронизации это оператор выбора. (заменено оригинальное имя таблицы 's и' columns / keys ') имеет' @ sync_initialized = 0 ' в первый раз , и при последующей синхронизации он заменяется на' 1 ', поэтому он вводится в' блок else и, следовательно, фильтрация работает .

Ниже приведена выдержка из файла трассировки:


VERBOSE,, 1, 07.09.2010 15: 54: 32: 408, Использование команды: "IF @sync_initialized = 0 ВЫБРАТЬ ИЗ ELSE НАЧАТЬ ВЫБРАТЬ ИЗ ПРИСОЕДИНИТЬСЯ CHANGETABLE (CHANGES, @sync_last_received_anchor) CT ON CT. [KeyId] =. [KeyId] ГДЕ (. [KeyId [in (выберите где = @ parm1)) AND (CT.SYS_CHANGE_OPERATION = 'I' И CT.SYS_CHANGE_CREATION_VERSION <= @sync_new_received_anchor AND (CT.SYS_CHANGE_CONTEXT IS NULL ИЛИ CT.SYS_CHANGE_CONTEXT <> @sync_binary))

IF CHANGE_TRACKING_MIN_VALID_VERSION (object_id (N ''))> @sync_last_received_anchor RAISERROR (Отслеживание изменений N'SQL-сервера очистило информацию отслеживания для таблицы ''% s ''. Чтобы исправить эту ошибку, клиент должен повторно инициализировать свою локальную базы данных и повторите попытку синхронизации. ', 16,3, N' ') END "

---------- значения parm, которые подставляются в запросе выше ----------- VERBOSE,, 1, 09.09.2010 15: 54: 32: 408, параметр: @sync_initialized Значение: 0 VERBOSE,, 1, 09.09.2010 15: 54: 32: 408, параметр: @sync_last_received_anchor Значение: 0 VERBOSE,, 1, 09.09.2010 15: 54: 32: 408, параметр: @sync_new_received_anchor Значение: 156 VERBOSE,, 1, 09.09.2010 15: 54: 32: 408, параметр: @sync_client_id_binary Len: 16 Значение: CE-5F-CB-9F-43-6E-71-4D-BE-5C-3C-9A -3 °-CA-0A-26

0 голосов
/ 01 ноября 2009

На самом деле я сделал это правильно, но проблема в том, что он не сохраняет CLIENT_ID и получает все данные, поскольку не знает измененных файлов ... Я решил эту проблему по-другому.

0 голосов
/ 01 ноября 2009

Похоже, что вы хотите отфильтровать данные, которые синхронизируются от сервера к клиенту - только данные для определенного учреждения должны быть загружены на клиент.

Проблема может заключаться в том, что вы предоставляете два параметра - один без значения. Подумайте об удалении SyncParameter и настройке значения для SqlParameter, которое вы передаете построителю следующим образом.

SqlParameter filterParameter = new SqlParameter("@Institution_ID", SqlDbType.UniqueIdentifier);
filterParameter.Value = new Guid("248a1343-decb-45a5-906f-2fa4d17f8d76");

Альтернативой (которую я не пробовал) может быть удаление параметра Sql - я бы оставил предложение фильтра таким, как оно есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...