SQLitePCL.SQLiteResult 即使在处理数据库连接后在 Step() 上返回 "BUSY"
SQLitePCL.SQLiteResult returning "BUSY" on Step() even after Disposing the Database Connection
我正在开发 UWP 应用程序并尝试在按钮单击事件中向数据库 table 插入行。这是相同的查询:
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。谢谢你的帮助。
无法保证这些 Dispose
调用确实发生(异常或其他流控制语句可能会干扰)。
为确保对象被释放,您应该使用using
:
using (var conn = new SQLiteConnection(...))
using (var selectCall = conn.Prepare("..."))
{
var t = selectCall.Step();
...
}
我在下载数据库后立即建立了数据库连接,这解决了我的问题。当我为每个数据库操作创建一个新连接时,问题就出现了,这导致数据库被锁定。处理该连接仍然不能解决这个问题,甚至将连接对象设置为 null 也无济于事。所以使用单个数据库连接对象解决了这个问题,这应该是一般的做法。希望这个答案有所帮助。
我正在开发 UWP 应用程序并尝试在按钮单击事件中向数据库 table 插入行。这是相同的查询:
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。谢谢你的帮助。
无法保证这些 Dispose
调用确实发生(异常或其他流控制语句可能会干扰)。
为确保对象被释放,您应该使用using
:
using (var conn = new SQLiteConnection(...))
using (var selectCall = conn.Prepare("..."))
{
var t = selectCall.Step();
...
}
我在下载数据库后立即建立了数据库连接,这解决了我的问题。当我为每个数据库操作创建一个新连接时,问题就出现了,这导致数据库被锁定。处理该连接仍然不能解决这个问题,甚至将连接对象设置为 null 也无济于事。所以使用单个数据库连接对象解决了这个问题,这应该是一般的做法。希望这个答案有所帮助。