InvalidOperationException в Sync Framework
Я написал обертку, используя платформу Sync, чтобы обеспечить общую функциональность.
Это мой код:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using System.Data.SqlClient;
using Microsoft.Synchronization;
namespace PluginTest.Components
{
public class P2PProvsionProvider
{
public SqlConnection RemoteConnection { get; set; }
public SqlConnection LocalConnection { get; set; }
private static Dictionary<string,DbSyncScopeDescription> scopes { get; set; }
private static SqlSyncScopeProvisioning remoteProvision { get; set; }
private static SqlSyncScopeProvisioning localProvision { get; set; }
private static P2PProvsionProvider provider;
//private P2PProvsionProvider() {
//}
public P2PProvsionProvider() {
scopes = new Dictionary<string, DbSyncScopeDescription>();
}
public static P2PProvsionProvider getInstance(string name) {
if (name.Equals("default"))
if (provider == null)
provider = new P2PProvsionProvider();
return provider;
}
//1
public void CreateProvisionScope(string name) {
if (!scopes.ContainsKey(name))
{
scopes.Add(name, new DbSyncScopeDescription(name));
}
}
//2
public void AddProvisionTable(string scopeName, string tableName) {
if (scopes[scopeName] != null)
{
DbSyncScopeDescription remoteScopeDesc = scopes[scopeName];
//DbSyncScopeDescription localScopeDesc = scopes[scopeName];
DbSyncTableDescription remoteTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, RemoteConnection);
//DbSyncTableDescription localTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable(tableName, LocalConnection);
remoteScopeDesc.Tables.Add(remoteTableDesc);
//localScopeDesc.Tables.Add(localTableDesc);
}
}
//3
public void ApplyScopeProvisioning (string scopeName){
remoteProvision = new SqlSyncScopeProvisioning(RemoteConnection, scopes[scopeName]);
remoteProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip);
remoteProvision.Apply();
localProvision = new SqlSyncScopeProvisioning(LocalConnection, scopes[scopeName]);
localProvision.SetCreateProceduresDefault(DbSyncCreationOption.Skip);
localProvision.Apply();
}
#region Scope Provisioning Builder methods
public SqlSyncScopeProvisioning BuilderCreateProcedures(DbSyncCreationOption option)
{
remoteProvision.SetCreateProceduresDefault(option);
return remoteProvision;
}
public SqlSyncScopeProvisioning BuilderCreateProceduresForAdditionalScope(DbSyncCreationOption option)
{
remoteProvision.SetCreateProceduresForAdditionalScopeDefault(option);
return remoteProvision;
}
public SqlSyncScopeProvisioning BuilderCreateTable(DbSyncCreationOption option)
{
remoteProvision.SetCreateTableDefault(option);
return remoteProvision;
}
public SqlSyncScopeProvisioning BuilderCreateTrackingTable(DbSyncCreationOption option)
{
remoteProvision.SetCreateTrackingTableDefault(option);
return remoteProvision;
}
public SqlSyncScopeProvisioning BuilderCreateTriggers(DbSyncCreationOption option)
{
remoteProvision.SetCreateTriggersDefault(option);
return remoteProvision;
}
public SqlSyncScopeProvisioning BuilderPopulateTrackingTable(DbSyncCreationOption option)
{
remoteProvision.SetPopulateTrackingTableDefault(option);
return remoteProvision;
}
public SqlSyncScopeProvisioning BuilderUseBulkProcedures(bool useBulk)
{
remoteProvision.SetUseBulkProceduresDefault(useBulk);
return remoteProvision;
}
#endregion
//4
public SyncOperationStatistics ExecuteSync(string scopeName , SyncDirectionOrder direction = SyncDirectionOrder.UploadAndDownload) {
SyncOrchestrator syncOrachestrator = new SyncOrchestrator() {
LocalProvider = new SqlSyncProvider(scopeName, LocalConnection),
RemoteProvider = new SqlSyncProvider(scopeName, RemoteConnection),
Direction = direction
};
((SqlSyncProvider)syncOrachestrator.LocalProvider).ApplyChangeFailed += (s,e) =>
{
};
return syncOrachestrator.Synchronize();
}
//5 Deprovision certain scope
public void DeprovisionScope(SqlConnection conn, string scopeName) {
SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(conn);
deprovisionScope.DeprovisionScope(scopeName);
}
//6 Deprovision All
public void DeprovisionStore(SqlConnection conn)
{
SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(conn);
deprovisionScope.DeprovisionStore();
}
}
}
Поскольку вопрос предполагает, я получаю InvalidOperationException, говоря, что Говоря, что некоторая хранимая процедура не существует. Приложение работает следующим образом: при условии следующего определения в форме
public GlobalFramework.Core core { get; set; }
public BindingList<string> addedTables { get; set; }
public BindingList<string> provisionedTables { get; set; }
public P2PProvsionProvider provider { get; set; }
public SyncOperationStatistics stats { get; set; }
1- Когда пользователь нажимает кнопку с текстом "Добавить область действия", выполняется следующее:
private void provisionButton_Click(object sender, EventArgs e)
{
provider.CreateProvisionScope(provisionScopeTextBox.Text);
foreach (var item in provisionedTables)
{
provider.AddProvisionTable(provisionScopeTextBox.Text, item);
}
}
2- Когда пользователь нажимает на кнопку с "Применить положение", делается следующее
private void applyProvisionButton_Click(object sender, EventArgs e)
{
provider.ApplyScopeProvisioning(provisionScopeTextBox.Text);
}
3- Когда пользователь нажимает кнопку "Синхронизировать", делается следующее
private void syncButton_Click(object sender, EventArgs e)
{
stats = provider.ExecuteSync(provisionScopeTextBox.Text);
statsLabel.Text = "Start time: " + stats.SyncStartTime + "End Time: " +stats.SyncEndTime+ "Change Total: "+stats.DownloadChangesTotal;
}
Теперь мне интересно, почему я получаю это исключение? Мое локальное соединение с базой данных - SQL Server 2008 R2. Моя удаленная база данных тоже SQL Server 2008 R2.
PS: я знаю, что я должен предоставить область только один раз.
1 ответ
Почему вы пропускаете создание хранимых процедур?
remoteProvision.SetCreateProceduresDefault (DbSyncCreationOption.Skip); localProvision.SetCreateProceduresDefault (DbSyncCreationOption.Skip);
Вы должны пропустить создание только в том случае, если вы знаете, что таблицы были подготовлены ранее, и в них уже были сохранены созданные процы.