【问题标题】:SQLite: No such tableSQLite:没有这样的表
【发布时间】:2013-03-07 18:44:55
【问题描述】:

我间歇性地SQLiteExceptions 声称“没有这样的表:HomepageSection”。它始终是同一张表,但停止应用程序并重新启动它,问题就消失了。如果数据库丢失,有时会发生这种情况,有时会发生。

这些表是在打开数据库文件时使用sqlite-nets SQLiteAsyncConnection.CreateTableAsync 方法创建的(是的,在此异常发生之前它们会被等待)。

我正在连接到正确的数据库文件,我已经检查了很多次。我直接在 SQLite 浏览器中打开从连接对象获取的路径,但 HomepageSection 表不存在。

SQLiteException 在以下查询中被抛出:insert OR REPLACE into "HomepageSection"("Title","Version","Id","Updated") values (?,?,?,?) (SQLite.cs, Prepare2(), line 2951)

据称创建表的行没有抛出异常:

await _connection.CreateTableAsync<HomepageSection>();

解决这个问题的想法?

【问题讨论】:

  • 我在一个普通的 Ruby 应用程序中看到了类似的东西。如果我遇到任何事情,我会告诉你的。感谢您发布此内容。
  • 您是否使用任何编译指示?您使用的是什么版本的 sqlite?
  • 没有编译指示。 Nuget 包 sqlite-net,版本 1.0.5。

标签: c# sqlite sqlite-net


【解决方案1】:

我遇到了同样类型的间歇性错误。我进行了以下更改,到目前为止,还没有客户报告新的错误。

我在连接字符串中关闭了 sqlite 自动创建数据库。

connectionString="Data Source=default.db3; Foreign Keys=true; FailIfMissing=True;"

启用 FailIfMissing 后,我收到无法打开数据库而不是没有此类表的报告。似乎 sqlite 无法打开我的 db3 文件,因此它创建了一个没有表的新数据库。它必须在内存中创建它,因为我在驱动器上找不到任何新的 db 文件。

为了纠正这个问题,我使用单例模式只建立一个连接并在应用程序的整个生命周期中保持打开状态。还有其他方法可以做到这一点,但我对单例有更多的经验。这不是完整的课程代码,只是让您入门的几个部分。

public static SQLite Instance
{
  get
  {
    if (instance == null) 
      {
        instance = new SQLite();
        mySQLiteConn = new SQLiteConnection(ConnectionString);
        mySQLiteConn.Open();
      }
      return instance;
  }
}

public void Execute(string SQL)
{
  using (SQLiteCommand myCommand = new SQLiteCommand(SQL, mySQLiteConn))
  {
    myCommand.ExecuteNonQuery().ToString();
  }
}

所以要执行插入,你会这样做:

SQLite.Instance.Execute("Insert .....;");

【讨论】:

  • 我的 SQLite 使用已经是单例了。问题可能是我随意使用Tasks,可能和多线程有关。
  • 如果你使用多线程,不要像我的例子那样创建你的实例,它不是线程安全的,你会得到到数据库的多个连接。你设置了 FailIfMissing=true 吗?
【解决方案2】:

我遇到了类似的问题。我所做的只是创建表(没有查询,没有别的),并通过直接查看数据库来查看表是否真的被创建。在这里,您可以了解您的数据结构是否存在问题。您已经完成了大部分事情,但如果没有创建表,您应该调查原因。

在我的情况下,intstring(id 字段和主键)之间有些混淆,我也忘记为一对一连接创建一个 id 属性。大多数情况下,异常并不提供信息,但您应该始终捕获异常并找到内部异常。有时他们可以给你一个提示。

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2016-11-18
    • 2012-05-14
    相关资源
    最近更新 更多