Я занимаюсь разработкой приложения UWP и пытаюсь вставить строки в таблицу базы данных по событию нажатия кнопки. Вот запрос для того же:

SQLiteConnection dbConnection = new SQLiteConnection
      (Path.Combine(ApplicationData.Current.LocalFolder.Path + "\\" + fileName + "\\" + fileName + ".db"));

var selectDB = @"*sample insert statement*";

ISQLiteStatement selectCall = dbConnection.Prepare(selectDB);

var t = selectCall.Step();

dbConnection.Dispose();
dbConnection = null;

selectCall.Dispose();
selectCall = null;

Запрос на вставку успешно выполнен в первый раз (var t = "DONE"). Проблема, с которой я сталкиваюсь, заключается в том, что после первого выполнения база данных по какой-то причине блокируется (var t = "BUSY"). Та же проблема сохраняется даже после вызова функции Dispose (). Я что-то здесь упускаю? Есть ли лучший способ сделать это? Я впервые работаю с SQLite. Спасибо за помощь.

0
Monish Koyott 20 Мар 2017 в 14:11

2 ответа

Лучший ответ

Нет никакой гарантии, что эти Dispose вызовы действительно произойдут (исключения или другие операторы управления потоком могут мешать).

Чтобы обеспечить удаление объектов, вы должны использовать using:

using (var conn = new SQLiteConnection(...))
using (var selectCall = conn.Prepare("..."))
{
    var t = selectCall.Step();
    ...
}
1
CL. 20 Мар 2017 в 12:35

Я установил соединение с базой данных, как только моя база данных была загружена, и это решило мою проблему. Проблема возникла, когда я создавал новое соединение для каждой операции базы данных, что приводило к блокировке базы данных. Утилизация этого соединения все равно не решит эту проблему, и даже установка объекта соединения на ноль не поможет. Таким образом, использование единого объекта подключения к базе данных решило проблему, которая должна быть обычной практикой. Надеюсь, этот ответ помог.

0
Monish Koyott 26 Сен 2017 в 14:29