【问题标题】:How to resolve "Storage Engine Operation Failed" with Microsoft.Sync?如何使用 Microsoft.Sync 解决“存储引擎操作失败”?
【发布时间】:2017-11-16 21:38:29
【问题描述】:

我开发了一个同步软件,可以使用 Microsoft Sync Framework 2.1 同步数据库和目录。

一段时间后,使用该应用程序的客户端收到此错误:

存储引擎操作失败,错误代码为 25104(HRESULT = 0x80004005,源 IID = {0C733A63-2A1C-11CE-ADE5-00AA0044773D},参数 =(4001, 0, 0, , , ,))。

我试图在我的代码中跟踪错误,但没有成功。

当 SyncOchestrator 开始同步时发生错误。从我得到的堆栈跟踪中:

在 Microsoft.Synchronization.Files.FileSyncProvider...ctor()

这是我的一些编码:

 try
        {
            // Set options for the sync operation
            FileSyncOptions options = FileSyncOptions.ExplicitDetectChanges |
                     FileSyncOptions.RecycleDeletedFiles | FileSyncOptions.RecyclePreviousFileOnUpdates | FileSyncOptions.RecycleConflictLoserFiles;

            FileSyncScopeFilter filter = new FileSyncScopeFilter();
            filter.FileNameExcludes.Add("*.lnk"); // Exclude all *.lnk files
            filter.FileNameExcludes.Add("*.mdf"); // Exclude all *.mdf files
            filter.FileNameExcludes.Add("*.ldf"); // Exclude all *.ldf files
            filter.FileNameExcludes.Add("*.MDF"); // Exclude all *.MDF files
            filter.FileNameExcludes.Add("*.LDF"); // Exclude all *.LDF files
            filter.FileNameExcludes.Add("*.tdms_index"); // Exclude all *.tdms_index files

            Thread.Sleep(50);
            // Synchronization of 2 Folders
            FileSyncProvider providerA = new FileSyncProvider(Guid.NewGuid(), replica1RootPath, filter, options);
            FileSyncProvider providerB = new FileSyncProvider(Guid.NewGuid(), replica2RootPath, filter, options);
            providerA.DetectChanges();
            providerB.DetectChanges();

            Thread.Sleep(50);
            SyncOrchestrator agent = new SyncOrchestrator();
            agent.LocalProvider = providerA;
            agent.RemoteProvider = providerB;
            agent.Direction = SyncDirectionOrder.Upload;
            MessageBox.Show("Let's SYNC");
            agent.Synchronize(); // The error happens here

            Thread.Sleep(50);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
            MessageBox.Show(e.StackTrace);
        }

你能帮我解决这个问题吗?我越来越沮丧,我不知道该往哪里看!该代码完美运行了一年。

更多信息:

  • 最终用户拥有文件夹所需的所有访问权限。
  • 文件服务器有足够的可用空间来写入。

我正在使用 C#、Microsoft.Synchronization 2.1、.Net 4、Visual Studio 2015。

非常感谢您的任何建议。

【问题讨论】:

    标签: c# desktop-application microsoft-sync-framework sql-server-2014-express


    【解决方案1】:

    我终于找到了解决办法。碰巧元数据文件太大/损坏。因此,为了解决我的问题,我将同步分段并一一选择所有子文件夹,而不是只选择一个包含 260 个文件的文件夹。

    foreach (string dep in Directory.GetDirectories(plantFolder1)) // different departements
                                {
                                    string depFolder1 = plantFolder1 + dep.Remove(0, plantFolder1.Length);
                                    string depFolder2 = depFolder1.Replace(subReplica1, subReplica2); ;
    
                                    Thread.Sleep(50);
                                    // Synchronization of 2 Folders
                                    FileSyncProvider providerA = new FileSyncProvider(Guid.NewGuid(), depFolder1, filter, options);
    
                                    bool exists = Directory.Exists(depFolder2);
                                    if (!exists)
                                        Directory.CreateDirectory(depFolder2);
    
                                    FileSyncProvider providerB = new FileSyncProvider(Guid.NewGuid(), depFolder2, filter, options);
                                    providerA.DetectChanges();
                                    providerB.DetectChanges();
    
                                    Thread.Sleep(50);
                                    SyncOrchestrator agent = new SyncOrchestrator();
                                    agent.LocalProvider = providerA;
                                    agent.RemoteProvider = providerB;
                                    agent.Direction = SyncDirectionOrder.Upload;
                                    agent.Synchronize();
                                    Thread.Sleep(50);
                                }
    

    这就是我的问题的解决方案。希望对大家有所帮助。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多