База данных SQLite не закрывается

Я продолжаю получать исключения в другой форме, которая добавляет в базу данных 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();

🤔 А знаете ли вы, что...
C# обладает сборщиком мусора, который автоматически управляет памятью, что снижает риск утечек памяти.


113
1

Ответ:

Решено

Посмотри на

Вы используете множество объектов, классы которых реализуют IDisposable (например, SQLiteConnection, SQLiteCommand, SQLiteDataReader), но вы не размещаете их правильно. Таким образом, неуправляемые ресурсы не освобождаются, и все, что не следует блокировать, остается заблокированным.

Решение: Каждый раз вы создаете объект, класс которого реализует IDisposable, вы либо

  • используйте его с оператором using, например,

    using (var sqlite_conn = new SQLiteConnection("Data Source=./LibraryDB.db;Version=3;"))
    {
        ...
    } 
    
  • или вручную убедитесь, что он всегда удален (обычно это блок try-finally).

Подробности о том, как использовать эти шаблоны, можно найти по ссылке выше.