You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动