存在文件共享违规。 SQL Server CE 3.5 SP2

问题描述 投票:0回答:1

我在使用 SQL Server CE 3.5 SP2 数据库的 .NET CF 应用程序中遇到了这个随机问题。

CF 应用程序启动时,它会执行数据库维护以验证

.SDF
数据库文件,以使用 SQL Server CE
Engine
类进行检查:

using (SqlCeEngine engine = new SqlCeEngine(Resources.SqlCeConnectionString))
{
   Log.Info("Starting database Verification.");

   if (!engine.Verify())
   {
      Log.Warn("Database failed verification.");
      engine.Repair(null, RepairOption.RecoverAllOrFail);
      Log.Info("Database successfully repaired.");
   }
   else
   {
      Log.Info("Database Verification successful.");
   }
}

如果应用程序已正确验证,则我将

.SDF
复制到备份文件夹中:

if (File.Exists(Resources.DatabaseFileLocation))
{
   File.Delete(Resources.BackupDatabaseFileLocation);
   File.Copy(Resources.DatabaseFileLocation, Resources.BackupDatabaseFileLocation);
   Log.Info("Database backup complete.");
}
else
{
   Log.Info("Could not find Device Database.");
}

备份完成后,应用程序将启动,并且应用程序尝试与

.SDF
建立的第一个连接会导致此异常:

存在文件共享违规。不同的进程可能正在使用该文件。

这是日志文件信息:

2013-05-13 11:52:29,894 [INFO ] - Starting database Verification.
2013-05-13 11:52:33,832 [INFO ] - Database Verification successful.
2013-05-13 11:52:33,838 [INFO ] - Database backup starting.
2013-05-13 11:52:46,941 [INFO ] - Database backup complete.
2013-05-13 11:52:47,933 [ERROR] - There is a file sharing violation. A different process might be using the file. [ \Program Files\ApplicationName\DB.sdf ]
    at System.Data.SqlServerCe.SqlCeConnection.ProcessResults(Int32 hr)    at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent)
    at System.Data.SqlServerCe.SqlCeConnection.Open()
    at CFApp.MainScreen.GetStartupData()
    at CFApp.MainScreen..ctor()
    at CFApp.Program.RunInReleaseMode() 
    at CFApp.Program.Main()

我已经研究这个问题的原因好几个星期了,但我找不到任何东西。任何指导或帮助将非常感激。

根据我迄今为止的努力,我可以确认这些事情

  • 问题是随机发生的。启动程序正常执行多次后就会随机抛出这个错误

  • 考虑到应用程序正处于启动过程中,此时没有与数据库建立其他连接。

  • 每次应用程序打开连接时,它都会在完成后立即将其丢弃。这是通过

    using
    语句完成的。在意外关闭/重新启动的情况下,没有打开的连接保持打开状态。

  • SqlCeEngine
    正在通过
    using
    声明进行处理。对象被处置和其连接关闭之间是否可能存在延迟?

  • 此时没有其他进程在运行。该设备是 锁定为只允许执行我的应用程序。任务 经理只显示

    ActiveSync
    和我的应用程序。设备偶尔 使用与另一个桌面应用程序通信
    OpenNETCF.Desktop.Communication
    通过 USB 的 RAPI 库。积极的 必须打开同步才能正常工作。这 与之通讯的台式电脑是Win XP。

  • 我在其他一些论坛上看到 ActiveSync 可能会保留 锁定可能导致问题的文件。在 ActiveSync 中 设备部分没有选择与设备同步 桌面。 “文件”复选框未选中。如果其他人有的话 关于如何确保该文件被排除在外的建议 ActiveSync,它也会非常有帮助。

  • 更新 - 我使用 dotPeek 查看

    SqlCeEngine
    Dispose 方法。我认为这里一切似乎都井然有序 连接应该得到正确处理?

     private void Dispose(bool disposing)
     {
       if (!disposing)
         return;
       this.connStr = (string) null;
       this.connTokens = (Hashtable) null;
       NativeMethods.DllRelease();
       this.isDisposed = true;
     }
    
  • 更新 - 我尝试运行此测试以查看是否可以重现该错误,但我什么也没得到。代码正确执行,应用程序正常启动,没有任何文件共享问题。

     for (int i = 0; i < 50; i++)
     {
         using (SqlCeEngine engine = new SqlCeEngine(Resources.SqlCeConnectionString))
         {
             //Log.Info("Starting database Verification.");
             if (!engine.Verify())
             {
                 Log.Warn("Database failed verification.");
                 engine.Repair(null, RepairOption.RecoverAllOrFail);
                 Log.Info("Database successfully repaired.");
             }
             else
             {
                 Log.Info("Verified" + i);
             }
         }
    
         if (File.Exists(Resources.BackupDatabaseFileLocation))
         {
             File.Delete(Resources.BackupDatabaseFileLocation);
         }
    
         File.Copy(Resources.DatabaseFileLocation, Resources.BackupDatabaseFileLocation);
         Log.Info("File Copied " + i);
         GetStartupData();
     }
    

提前非常感谢您提供的任何信息。

windows-mobile compact-framework sql-server-ce windows-mobile-6.5
1个回答
1
投票

我发现并不是所有的类都像他们应该的那样实现

IDisposable
。例如,Microsoft 的 OLE JET 数据库引擎在从
using
语句调用时不会关闭数据库连接。

您可能会遇到这些问题。

我建议首先在您的连接上显式调用

Close()
。如果这不能解决问题,您可以添加对
Dispose()
的显式调用。

也可能是垃圾收集器 (GC) 在您的应用程序尝试再次访问它之前没有机会处理所有

IDisposable
代码。

© www.soinside.com 2019 - 2024. All rights reserved.