如何在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
相关产品推荐
相关产品推荐

