相关疑难解决方法(0)

System.Data.SQLite Close()不释放数据库文件

在尝试删除文件之前,我在关闭数据库时遇到问题.代码就是这样

 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)

sqlite system.data.sqlite

82
推荐指数
9
解决办法
4万
查看次数

DbContext不会发布SQLite数据库

首先,这些是我的意图:

  1. 在SQLite上创建DbContext
  2. 从/向它读写
  3. 关闭背景
  4. 将文件移动到另一个位置

点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)

c# sqlite filelock entity-framework-4 file-move

7
推荐指数
1
解决办法
2689
查看次数