SQLite:没有这样的表

时间:2013-03-19 07:20:27

标签: c# sqlite sqlite-net

我正在断断续续地SQLiteException声称“没有这样的表:HomepageSection”。它始终是相同的表,但停止应用程序并再次启动它,问题就消失了。如果数据库丢失,有时会发生这种情况,有时会出现这种情况。

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

我正在连接到正确的数据库文件,我多次检查过这个。我直接在SQLite浏览器中打开了从连接对象获得的路径,并且HomepageSection表不存在。

以下查询引发SQLiteExceptioninsert OR REPLACE into "HomepageSection"("Title","Version","Id","Updated") values (?,?,?,?)(SQLite.cs,Prepare2(),第2951行)

据称创建该表的行没有例外:

await _connection.CreateTableAsync<HomepageSection>();

想出这个想法?

2 个答案:

答案 0 :(得分:0)

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

我在连接字符串中关闭了sqlite autocreate数据库。

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 .....;");

答案 1 :(得分:0)

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

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