不是从模板创建的范围不能具有FilterParameters错误

时间:2012-01-27 00:46:49

标签: microsoft-sync-framework

我正在尝试构建“WebSharingAppDemo-SqlProviderEndToEnd”msdn示例应用程序以构建自定义MSF实现。作为其中的一部分,我将参数化过滤器添加到配置中。我一直在引用http://jtabadero.wordpress.com/2010/09/02/sync-framework-provisioning/来了解如何执行此操作。现在我有了这个,当我重新初始化“peer1”数据库并尝试最初配置它时,我现在得到一个错误:

  

未从模板创建的范围不能包含FilterParameters。   在表'[my_table_name]'上找到参数'@my_param_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 个答案:

答案 0 :(得分:1)

我猜错误是不言自明的。

只有在范围继承自过滤器模板时,才能设置FilterParameters。您不能为正常范围设置FilterParameters,只能设置FilterClause。

使用基于参数的过滤器分为两个步骤:定义过滤器/范围模板并基于模板创建范围。

我建议您再次重新阅读博客条目,然后跳转到基于参数的过滤器部分。