UWP中使用Microsoft.Data.Sqlite执行查询无结果问题求助
这种情况我之前在做UWP项目时碰到过好几次,大概率是这几个细节没处理好,咱们一步步来排查:
先排查最容易踩坑的:数据库路径是否一致
UWP里的文件目录坑特别多,很多人会把应用的本地数据目录和安装目录搞混。你插入数据的路径和查询时用的路径是不是同一个?
- 安装目录(
Package.Current.InstalledLocation)是只读的,根本存不了你插入的数据; - 正确的路径应该是应用的本地私有目录:
ApplicationData.Current.LocalFolder
确保插入和查询用的是同一个连接字符串,比如:
var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "你的数据库文件名.db"); var connectionString = new SqliteConnectionStringBuilder { DataSource = dbPath, Cache = SqliteCacheMode.Shared // 这个后面会说为啥重要 }.ToString();
检查事务是否提交(虽然你说浏览器能看到,但还是确认下)
如果你插入数据的时候用了事务,但忘了调用Commit(),那数据只会停留在当前连接的事务中,不会写入磁盘。不过你用浏览器能查到数据,说明这个概率不高,但还是看看插入代码有没有类似的疏漏:
using (var transaction = connection.BeginTransaction()) { // 你的插入逻辑 // 是不是漏了 transaction.Commit(); 这一行? }
如果没Commit,事务会在using块结束时自动回滚,数据就没了,但你说浏览器能看到,那这个可能性很小。
确认数据读取的代码逻辑有没有问题
你只贴了查询语句,没贴后续的读取代码,会不会是读取时的逻辑错了?比如有没有调用ExecuteReader(),有没有移动到数据行?正确的读取逻辑应该是这样的:
using (var connection = new SqliteConnection(connectionString)) { connection.Open(); string _query = "SELECT [Source] FROM [Sessions] ORDER BY [MinTimeOffset];"; using (var command = new SqliteCommand(_query, connection)) { using (var reader = command.ExecuteReader()) { // 先判断有没有数据 if (reader.HasRows) { // 必须调用Read()才能移动到第一条记录 while (reader.Read()) { var sourceValue = reader.GetString(0); // 处理你的数据 } } else { // 这里才是真的没读到数据 } } } }
会不会你直接跳过了reader.Read(),或者没判断HasRows就想取值?
开启共享缓存解决连接隔离问题
Microsoft.Data.Sqlite默认的缓存模式是Private,每个连接有自己独立的缓存。如果你插入数据用的是一个连接,查询用了另一个新连接,查询连接的缓存可能没刷新,就看不到最新插入的数据。这时候在连接字符串里加上Cache=Shared就能解决(就是我第一点里写的连接字符串配置),让多个连接共享同一个缓存,就能实时读到最新数据了。
最后确认连接是否正确释放
确保所有数据库操作的连接、命令、阅读器都用using块包裹,这样能自动释放资源,避免数据库文件被锁定。如果连接没释放,虽然你用浏览器能打开,但也可能出现查询异常的情况,不过这个概率比较低。
按这个顺序排查,大概率能找到问题所在!
内容的提问来源于stack exchange,提问作者Diado




