You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中获取SQLite查询结果数组?解决仅能读取首行问题

解决SQLite IDataReader只能读取第一行的问题

嗨,这个问题其实很好解决!IDataReader本身是一个向前只读的数据流,默认停在第一行数据的前面,你第一次调用Read()才会移动到第一行,之后每次调用Read()就会切换到下一行——直到没有更多数据时返回false。

你之前的代码只执行了ExecuteReader(),没有循环调用Read(),所以只能拿到第一行数据。另外还要提醒你,数据库连接、命令和阅读器都是需要手动释放的资源,最好用using语句来自动管理,避免内存泄漏和连接池耗尽的问题。

给你修改后的完整代码示例:

private void DB_Load_test()
{
    // 使用using自动释放连接资源,离开代码块时自动关闭连接
    using (var connection = new SqliteConnection(_sqlDBLocation))
    {
        connection.Open();
        
        // 使用using管理命令资源
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "SELECT * FROM some_table";
            
            // 使用using管理DataReader资源,读完自动释放
            using (var reader = command.ExecuteReader())
            {
                // 循环调用Read(),遍历所有行
                while (reader.Read())
                {
                    // 读取当前行的列值,这里提供几种常见方式:
                    // 1. 按列索引读取(索引从0开始)
                    var firstColumnValue = reader.GetValue(0);
                    // 2. 按列名读取,更直观
                    var targetColumnValue = reader["your_column_name"];
                    // 3. 强类型读取(推荐,避免类型转换问题)
                    var intValue = reader.GetInt32(1);
                    var stringValue = reader.GetString(2);
                    
                    // 这里把读取到的数据存入你的列表/数组
                    // 比如:yourResultList.Add(new YourDataModel { Prop1 = firstColumnValue, Prop2 = stringValue });
                }
            }
        }
    }
}

关键要点说明:

  • reader.Read()的作用:每次调用会将阅读器移动到下一行,返回true表示还有可读取的行,返回false则说明已经遍历完所有数据,循环结束。
  • using语句的必要性:数据库相关的资源(连接、命令、阅读器)都实现了IDisposable接口,using会在代码块结束时自动调用Dispose()方法,帮你关闭连接、释放资源,这是.NET操作数据库的最佳实践。
  • 读取列值的最佳方式:优先使用强类型的GetXXX()方法(比如GetString()、GetInt32()),这样可以避免后续的类型转换错误,也更高效。

内容的提问来源于stack exchange,提问作者sol-invictii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:36:58