Области, не созданные из шаблона, не могут иметь ошибку FilterParameters - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь использовать пример приложения MSDN "WebSharingAppDemo-SqlProviderEndToEnd" для создания пользовательской реализации MSF. В рамках этого я добавил параметризованные фильтры для обеспечения. Я ссылаюсь на http://jtabadero.wordpress.com/2010/09/02/sync-framework-provisioning/, чтобы понять, как это сделать. Теперь, когда у меня это есть, когда я заново инициализирую базу данных "peer1" и пытаюсь подготовить ее изначально, я теперь получаю ошибку:

Области, не созданные из шаблона, не могут иметь FilterParameters. Параметр '@my_param_name' был найден в таблице '[my_table_name]'. Убедитесь, что в области действия не определены параметры FilterParameters. это не создано из шаблона.

Единственное, что я имею в виду относительно того, что такое "шаблон", это шаблоны предоставления, с которыми могут работать инструменты Sync Toolkit, но я не думаю, что это применимо в сценарии, с которым я работаю.

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

Код ниже - это то, что я использую, чтобы встроить фильтрацию в объект обеспечения (SqlSyncScopeProvisioning).

private void AddFiltersToProvisioning(IEnumerable<TableInfo> tables)
{
    IEnumerable<FilterColumn> filters = this.GetFilterColumnInfo();
    foreach (TableInfo tblInfo in tables)
    {
        this.AddFiltersForTable(tblInfo, filters);
    }
}

private void AddFiltersForTable(TableInfo tblInfo, IEnumerable<FilterColumn> filters)
{
    IEnumerable<FilterColumn> tblFilters;
    tblFilters = filters.Where(x => x.FilterLevelID == tblInfo.FilterLevelID);
    if (tblFilters != null && tblFilters.Count() > 0)
    {
        var tblDef = this.GetTableColumns(tblInfo.TableName);
        StringBuilder filterClause = new StringBuilder();
        foreach (FilterColumn column in tblFilters)
        {
            this.AddColumnFilter(tblDef, column.ColumnName, filterClause);
        }

        this.Provisioning.Tables[tblInfo.TableName].FilterClause = filterClause.ToString();
    }
}

private void AddColumnFilter(IEnumerable<TableColumnInfo> tblDef, string columnName, StringBuilder filterClause)
{
    TableColumnInfo columnInfo;
    columnInfo = tblDef.FirstOrDefault(x => x.ColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
    if (columnInfo != null)
    {
        this.FlagColumnForFiltering(columnInfo.TableName, columnInfo.ColumnName);
        this.BuildFilterClause(filterClause, columnInfo.ColumnName);
        this.AddParamter(columnInfo);
    }
}

private void FlagColumnForFiltering(string tableName, string columnName)
{
    this.Provisioning.Tables[tableName].AddFilterColumn(columnName);
}

private void BuildFilterClause(StringBuilder filterClause, string columnName)
{
    if (filterClause.Length > 0)
    {
        filterClause.Append(" AND ");
    }

    filterClause.AppendFormat("[base].[{0}] = @{0}", columnName);
}

private void AddParamter(TableColumnInfo columnInfo)
{
    SqlParameter parameter = new SqlParameter("@" + columnInfo.ColumnName, columnInfo.GetSqlDataType());
    if (columnInfo.DataTypeLength > 0)
    {
        parameter.Size = columnInfo.DataTypeLength;
    }

    this.Provisioning.Tables[columnInfo.TableName].FilterParameters.Add(parameter);
}

1 Ответ

1 голос
/ 27 января 2012

Полагаю, ошибка не требует объяснений.

Параметры FilterParameters можно установить только в том случае, если область действия наследуется от шаблона фильтра.Вы не можете установить FilterParameters для обычной области, только FilterClause.

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

Я предлагаю вам еще раз перечитать запись в блоге и перейти к разделу Фильтры на основе параметров.

...