可能损坏SQLite表后奇怪的“;没有这样的表“;错误

本文关键字:错误 能损坏 SQLite | 更新日期: 2023-09-27 18:27:05

首先一些基本信息

  • 我在Win10 x64的根C:驱动器上的"程序文件"文件夹中有一个SQLite数据库
  • 我正在从3个程序同时访问数据库

问题

我使用DB Browser for SQLite创建了一个新表table2。然后,我尝试在VS2013的调试模式下使用一个简单的应用程序插入一行。代码很简单:

using (SQLiteConnection database = new SQLiteConnection("Data Source=C:/Program Files/myapp/testdb.db;Version=3;"))
{
    database.Open();
    using (SQLiteCommand cmd = database.CreateCommand())
    {
        cmd.CommandText = "INSERT INTO trades VALUES (@id, @pass);";
        cmd.Prepare();
        cmd.Parameters.AddWithValue("@id", 36365);
        cmd.Parameters.AddWithValue("@pass", "verysecurepassword123");
        cmd.ExecuteNonQuery();
    }
}

在运行时,它给了我一个SQL logic error or missing database错误,消息为no such table。我试了很多次,但都得到了同样的结果。一直以来,DB Browser都告诉我该表存在,即使在我尝试重新启动它之后也是如此;这意味着该表确实存在。[值得注意的一点可能是VS是在非管理员模式下运行的,这可能是一个问题,因为它需要管理员权限才能写入数据库。]

然后我尝试将CommandText更改为SELECT COUNT(*) FROM sqlite_master;并执行标量。结果是1,这意味着它无法看到新表。

编辑:我几乎完全确定这是某种缓存问题,因为我试图在数据库的副本上再次列出表(不同的路径),它正确读取了2个表。

然后我尝试重新启动VS,之后错误立即变为cannot write to readonly table。我再次尝试重新启动,这次是用管理员权限,它识别出了表并插入得很好。

我的问题

  1. 是什么导致第一个异常给出了错误的原因
  2. 它是如何神奇地修复重新启动VS的
  3. 在同一个数据库上运行的第三个应用程序在VS的一个单独的管理实例上,但调试器是分离的。这个应用程序是一个小型服务器,我总是从VS运行它,所以我可以很容易地调试。它使用第一个表(而不是新表)。造成上述(缓存?)问题的原因是否也可能导致该应用程序中使用的第一个表上的数据损坏

可能损坏SQLite表后奇怪的“;没有这样的表“;错误

Program Files目录对非管理员具有写保护。有时,为了向后兼容,Windows会尝试将写入重定向到其他目录,但正如您所看到的,这并不总是可靠的。

将需要更改的文件放入您有写访问权限的目录(即应用程序数据目录)。

相关文章: