windows-mobile - 存在文件共享冲突。 SQL Server CE 3.5 SP2

标签 windows-mobile compact-framework sql-server-ce windows-mobile-6.5

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

当 CF 应用程序启动时,它会执行数据库维护以验证 .SDF使用 SQL Server CE 检查的数据库文件 Engine类(class):

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 建立第一个连接。导致此异常:
There is a file sharing violation. A different process might be using the file.

这是日志文件信息:
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
    设备部分没有选择与
    桌面。 "file"复选框未选中。如果其他人有任何
    关于如何确保该文件被排除在外的建议
    ActiveSync,它也会很有帮助。
  • 更新 - 我使用 dotPeek 查看 SqlCeEngine处置方法。我认为这里和我的一切似乎都井然有序
    连接应该得到妥善处理?
    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();
    }
    

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

    最佳答案

    我发现并不是所有的类都实现了 IDisposable就像他们应该做的那样。例如,Microsoft 的 OLE JET 数据库引擎在从 using 调用时不会关闭数据库连接。陈述。

    你可能在这里遇到这些问题。

    我建议,作为开始,明确调用 Close()在你的连接上。如果这不能解决问题,您可以添加对 Dispose() 的显式调用。 .

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

    关于windows-mobile - 存在文件共享冲突。 SQL Server CE 3.5 SP2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16577919/

    相关文章:

    c# - 应用程序在 15 分钟后崩溃,WCE 6.0 CF 3.5 Motorola MC3190

    c# - 日期时间格式异常错误

    sql-server - 如何在 SQL Server Compact 中添加默认值?

    sql-server-ce - SQL Compact随机产生AccessViolationException

    c# - 如何将字符串转换为控件?

    windows - 在 win32 上构建多语言应用程序的最佳实践是什么?

    c++ - Dvorak SIP 未在某些设备(如 Pidion)中显示

    java - J2ME 上的 JDBC 支持

    sql-server - 提取 sql server 精简版的架构

    c# - 访问 WinCE ComboBox DroppedDown 属性 (.NET CF 2.0)