在尝试删除文件之前,我在关闭数据库时遇到问题.代码就是这样
myconnection.Close();
File.Delete(filename);
Run Code Online (Sandbox Code Playgroud)
并且Delete抛出了一个异常,即该文件仍在使用中.几分钟后我在调试器中重新尝试了Delete(),所以这不是时间问题.
我有事务代码,但在Close()调用之前它根本不运行.所以我很确定这不是一个开放的交易.打开和关闭之间的sql命令只是选择.
ProcMon显示我的程序和我的防病毒软件查看数据库文件.它没有显示我的程序在close()之后释放db文件.
Visual Studio 2010,C#,System.Data.SQLite版本1.0.77.0,Win7
我看到一个两岁的bug就像这样,但更新日志说它已修复.
还有什么我可以检查的吗?有没有办法获得任何打开的命令或事务的列表?
新的工作代码:
db.Close();
GC.Collect(); // yes, really release the db
bool worked = false;
int tries = 1;
while ((tries < 4) && (!worked))
{
try
{
Thread.Sleep(tries * 100);
File.Delete(filename);
worked = true;
}
catch (IOException e) // delete only throws this on locking
{
tries++;
}
}
if (!worked)
throw new IOException("Unable to close file" + filename);
Run Code Online (Sandbox Code Playgroud) 首先,这些是我的意图:
点1-3完美地工作.当我尝试移动数据库时,问题就开始了.我得到一个错误说明:
'The process cannot access the file because it is being used by another process.'
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
首先,我创建一个上下文.我必须在几种方法中使用它,我不想在每次需要时创建它.所以我将它存储为成员.
_sqliteContext = new SqlLiteContext(sqliteContextName);
Run Code Online (Sandbox Code Playgroud)
然后我想访问一个名为的表sync并获取其最新条目.
var sync = _sqliteContext.Syncs.OrderByDescending(s => s.Date);
_lastSync = sync.Any() ? sync.First().Date : new DateTime(0);
Run Code Online (Sandbox Code Playgroud)
而已.然后我关闭上下文.
_sqliteContext.Dispose();
Run Code Online (Sandbox Code Playgroud)
并尝试移动文件.
File.Move(sqliteUploadLocation, sqliteDownloadLocation);
Run Code Online (Sandbox Code Playgroud)
这是我得到例外的地方.
当我用插入替换选择时,如下所示:
var sync = new Sync { Id = Guid.NewGuid().ToString(), Date = DateTime.Now };
_sqliteContext.Syncs.Add(sync);
_sqliteContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这有效,我可以移动数据库.任何想法为什么我的选择不释放锁定?
更新
// Start synchronisation.
new SyncManager(mssqlString, sqliteUploadLocation).Start();
// Move file from upload to download …Run Code Online (Sandbox Code Playgroud)