2012-01-27 37 views
0

我想建立在「WebSharingAppDemo-SqlProviderEndToEnd」msdn示例應用程序構建出一個自定義的MSF實現。作爲其中的一部分,我將參數化過濾器添加到配置中。我一直在參考http://jtabadero.wordpress.com/2010/09/02/sync-framework-provisioning/瞭解如何做到這一點。現在,我已經到位,當我重新初始化「等方」數據庫,並嘗試提供它最初我現在得到一個錯誤:範圍不是從模板創建不能使用FilterParameters錯誤

Scopes not created from a template cannot have FilterParameters. Parameter '@my_param_name' was found on Table '[my_table_name]'. Please ensure that no FilterParameters are being defined on a scope that is not created from a template.

唯一想我必須以什麼爲「模板」的是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

我想錯誤是不言自明的。

只有在範圍繼承自過濾器模板時,才能設置FilterParameters。您不能將FilterParameters設置爲正常範圍,只能設置FilterClause。

使用基於參數的過濾器有兩個步驟:定義過濾器/範圍模板並基於模板創建範圍。

我建議您再次重新閱讀博客條目並跳轉到基於參數的過濾器部分。

+0

我想我找到了我想念的東西。我不知何故錯過了配置對象的構造函數中的'SqlSyncScopeProvisioningType.Template'。謝謝你的幫助。 – davidpricedev 2012-01-27 15:31:11