加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:42:16 所属栏目:Windows 来源:网络整理
导读:我在使用SQL Server CE 3.5 SP2数据库的.NET CF应用程序中得到了这个随机问题. 当CF应用程序启动时,它执行数据库维护以验证.SDF数据库文件以使用SQL Server CE Engine类进行检查: using (SqlCeEngine engine = new SqlCeEngine(Resources.SqlCeConnectionSt
我在使用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进行的第一次连接导致此异常:

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 FilesApplicationNameDB.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 RAPI库通过USB.活性
必须打开同步才能使其正常工作.该
它与之通信的台式电脑是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();
}

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

解决方法

我发现并非所有类都像他们应该的那样实现IDisposable.例如,Microsoft的OLE JET数据库引擎在从using语句调用时不会关闭数据库连接.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读