我在使用 SQL Server CE 3.5 SP2 数据库的 .NET CF 应用程序中遇到了这个随机问题。
当 CF 应用程序启动时,它执行数据库维护以验证.SDF
数据库文件以使用 SQL Server CEEngine
类进行检查:
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 库与另一个桌面应用程序通信 。必须打开 Active Sync 才能正常工作。它与之通信的台式计算机是 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(); }
非常感谢您提前提供的任何信息。