Фильтрация структуры диаграммы синхронизации не работает должным образом

92
13

Я создал приложение синхронизации для приложения POS (точка продаж). Один сервер связан с несколькими терминалами. серверные и терминальные базы данных имеют [pos_terminal] таблицу. он имеет столбец [POS_TERMINAL_ID] как личность. Вот как я предоставляю сервер.

            try
{
string strScopeName = "";
strScopeName = "TERMINAL_SCOPE_T01";

SqlConnection serverConn = new SqlConnection(strServer_Connection);

//pos_terminal

DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(strScopeName);
DbSyncTableDescription pos_terminal_Description = SqlSyncDescriptionBuilder.GetDescriptionForTable("pos_terminal", serverConn);
scopeDesc.Tables.Add(pos_terminal_Description);

SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);
serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);

serverProvision.ObjectSchema = "Sync";
serverProvision.Tables["pos_terminal"].AddFilterColumn("POS_TERMINAL_ID");
serverProvision.Tables["pos_terminal"].FilterClause = "[side].[POS_TERMINAL_ID]='T01'";

if (serverProvision.ScopeExists(strScopeName))
{
return;
}

serverProvision.Apply();
MessageBox.Show("Server provisioned with scope " + strScopeName);

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());

}

и ниже, Как я предоставляю базу данных терминала.

try
{
string strScopeName = "";
strScopeName = "TERMINAL_SCOPE_T01";

SqlConnection clientConn = new SqlConnection(strTerimal_Connection);
SqlConnection serverConn = new SqlConnection(strServer_Connection);
DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(strScopeName, null, "Sync", serverConn);
SqlSyncScopeProvisioning clientProvision = new SqlSyncScopeProvisioning(clientConn, scopeDesc);

clientProvision.ObjectSchema = "Sync";
clientProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);

if (clientProvision.ScopeExists(strScopeName))
{
return;
}

clientProvision.Apply();
MessageBox.Show("Terminal provisioned with scope " + strScopeName);

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

Все это основная фильтрация.

Проблема заключается в том, что в TERMINAL 01, когда я установил POS_TERMINAL_ID в "T01" (при фильтрации), он работает хорошо, и отфильтрованные данные синхронизируются с таблицей [pos_terminal]. Но в TERMINAL 02, когда я устанавливаю POS_TERMINAL_ID на "T02" (при фильтрации), данные синхронизируются относительно T01, но не T02.

То же самое происходит в TERMINAL 03 (синхронизированный T01, но не T03).

Я тестировал отдельно, просто создав 2 таблицы в 2 базах данных и протестировал кодирование. Кодирование работает отлично. В другой таблице была ссылка с внешним ключом на [POS_TERMINAL_ID]. Я удалил его и также протестировал в базе данных POS. но не повезло.

У кого есть решения для такого сценария?

благодаря

спросил(а) 2015-05-06T15:19:00+03:00 5 лет, 5 месяцев назад
1
Решение
99

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

лучше использовать шаблоны областей вместо добавления новой хранимой процедуры выбора изменений.

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

ответил(а) 2015-05-07T05:04:00+03:00 5 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема