C# 查询SQLite数据库无法获取float/string等强类型返回值问题
核心错误原因
- 你返回
SQLiteDataReader前就关闭了数据库连接:SQLiteDataReader是流式读取对象,必须依赖活跃的数据库连接才能读取数据,连接关闭后Reader就失效了,所以访问字段时报行不存在的错误。 - 变量作用域错误:你在
try代码块内定义的SQLiteDataReader r,作用域仅在try块内,方法末尾的return r本身就无法通过编译。 - 单值查询用错了API:仅查询单个字段的单条结果时,不需要用
ExecuteReader,直接用ExecuteScalar方法就能直接拿到目标值。
修复后的实现代码
using System; using System.Data.SQLite; namespace Cryptomoney { class DataClass { private SQLiteConnection sqlite; public DataClass() { sqlite = new SQLiteConnection("Data Source= DataCrypto.sqlite3;Version=3;New=False;"); } // 新增:查询单值的方法,直接返回object类型结果,后续自行转换为对应类型 public object SelectSingleValue(string query) { try { sqlite.Open(); using SQLiteCommand sqlComm = sqlite.CreateCommand(); sqlComm.CommandText = query; return sqlComm.ExecuteScalar(); } catch (SQLiteException ex) { Console.WriteLine(ex); return null; } finally { // 确保不管是否报错都关闭连接 if (sqlite.State == System.Data.ConnectionState.Open) { sqlite.Close(); } } } // 如果需要查询多行多列,可以用这个方法返回DataTable,连接关闭后也可以正常读取 public System.Data.DataTable SelectQuery(string query) { try { sqlite.Open(); using SQLiteCommand sqlComm = sqlite.CreateCommand(); sqlComm.CommandText = query; using SQLiteDataAdapter adapter = new SQLiteDataAdapter(sqlComm); System.Data.DataTable dt = new System.Data.DataTable(); adapter.Fill(dt); return dt; } catch (SQLiteException ex) { Console.WriteLine(ex); return null; } finally { if (sqlite.State == System.Data.ConnectionState.Open) { sqlite.Close(); } } } // 优化后的非查询操作方法,保证连接正常关闭 public void ExecuteNonQuery(string query) { try { sqlite.Open(); using SQLiteCommand cmd = sqlite.CreateCommand(); cmd.CommandText = query; cmd.ExecuteNonQuery(); } catch (SQLiteException ex) { Console.WriteLine(ex); } finally { if (sqlite.State == System.Data.ConnectionState.Open) { sqlite.Close(); } } } } }
调用示例
1. 获取float类型值
var result = dataClass.SelectSingleValue("SELECT PercChange1h FROM DataCrypt WHERE ID = 1"); // 先判断是否为空,避免数据库字段为null时报转换错误 if (result != null && result != DBNull.Value) { float b = Convert.ToSingle(result); // 后续直接使用b即可 }
2. 获取string类型值
var result = dataClass.SelectSingleValue("SELECT 字段名 FROM 表名 WHERE 条件"); if (result != null && result != DBNull.Value) { string str = result.ToString(); }
3. 获取int类型值
var result = dataClass.SelectSingleValue("SELECT 字段名 FROM 表名 WHERE 条件"); if (result != null && result != DBNull.Value) { int num = Convert.ToInt32(result); }
4. 多行多列查询的用法
var dt = dataClass.SelectQuery("SELECT * FROM DataCrypt"); if (dt != null && dt.Rows.Count > 0) { // 读取第一行的PercChange1h字段 float b = Convert.ToSingle(dt.Rows[0]["PercChange1h"]); // 遍历所有行 foreach (System.Data.DataRow row in dt.Rows) { float val = Convert.ToSingle(row["PercChange1h"]); // 处理每一行数据 } }
内容的提问来源于stack exchange,提问作者Polonit
相关产品推荐
相关产品推荐

