【问题标题】:SQLite database not closingSQLite 数据库未关闭
【发布时间】:2018-08-16 14:18:00
【问题描述】:

我不断在另一个表单上收到异常,该表单添加到 sqlite 数据库中,说数据库已锁定,但是当我尝试将数据放入新数据库时,它可以工作。我能得出的唯一结论是数据库没有正确关闭以保持其锁定。有人可以帮忙吗?

SQLiteConnection sqlite_conn = new SQLiteConnection("Data Source=./LibraryDB.db;Version=3;");
        SQLiteCommand sqlite_cmd;
        SQLiteDataReader sqlite_datareader;
        sqlite_conn.Open();
        sqlite_cmd = sqlite_conn.CreateCommand();
        string query = "SELECT * FROM Books";
        sqlite_cmd.CommandText = query;
        sqlite_datareader = sqlite_cmd.ExecuteReader();
        //Initialise table
        listBooks.View = View.Details;
        listBooks.GridLines = true;
        listBooks.FullRowSelect = true;
        listBooks.Columns.Add("ID", 100);
        listBooks.Columns.Add("ISBN", 100);
        listBooks.Columns.Add("Title", 100);
        listBooks.Columns.Add("Author", 100);
        listBooks.Columns.Add("Year", 100);
        listBooks.Columns.Add("Edition", 100);
        listBooks.Columns.Add("TagID", 150);
        DataTable booksDataTable = new DataTable();
        SQLiteDataAdapter booksDataAdapter = new SQLiteDataAdapter(query, sqlite_conn);
        DataSet booksDataSet = new DataSet();
        booksDataAdapter.Fill(booksDataSet);
        foreach (DataRow row in booksDataSet.Tables[0].Rows)
        {
            ListViewItem listitem = new ListViewItem(row[0].ToString());
            for (int i = 1; i < booksDataSet.Tables[0].Columns.Count; i++)
            {
                listitem.SubItems.Add(row[i].ToString());
            }
            listBooks.Items.Add(listitem);
        }
        sqlite_conn.Close();

【问题讨论】:

  • Database not closed的可能重复
  • 根据需要创建、使用和处置您的连接。有方便的using 语句用于此类事情
  • 尝试设置为 null : sqlite_conn = null;
  • @jdweng 不幸的是没有骰子
  • Dispose() 怎么样?

标签: c# sqlite


【解决方案1】:

看看

您使用了许多其类实现了IDisposable 的对象(例如,SQLiteConnectionSQLiteCommandSQLiteDataReader),但您没有正确处置它们。因此,非托管资源不会被释放,不应该被锁定的东西会保持锁定状态。

解决方案:每次你创建一个类实现IDisposable的对象,你要么

  • 将它与using 语句一起使用,例如,

    using (var sqlite_conn = new SQLiteConnection("Data Source=./LibraryDB.db;Version=3;"))
    {
        ...
    } 
    
  • 或手动确保它始终被释放(通常涉及try-finally 块)。

可以在上面的链接中找到有关如何使用这些模式的详细信息。

【讨论】:

  • 我将 SQLiteConnection、SQLiteCommand 和 SQLiteDataReader 放入 using 语句中,一切正常,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2015-05-22
  • 2012-02-28
相关资源
最近更新 更多