c# - SQLite:没有这样的表

标签 c# sqlite sqlite-net

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

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

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

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

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

await _connection.CreateTableAsync<HomepageSection>();

解决这个问题的想法?

最佳答案

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

我在连接字符串中关闭了 sqlite autocreate database。

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

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

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

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

关于c# - SQLite:没有这样的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15493625/

相关文章:

c# - 传递给存储库方法的表达式未正确编译

c# - InteropBitmap同步

c# - 复制一个数组并将其存储在另一个数组中

安卓缓存框架

c# - UWP SQLite 查询结果类包含另一个类

c# - 检索包含所有子元素(和子子元素)的对象

c# - 发布新版本时,正在运行的 Azure Function 是否完成或终止?

c# - IntPtr 不包含 native 值

mysql - sqlite 事务未显示在 test.log 中

python - 为什么这个 group_by/count 查询返回一个元组数组?