C#如何正确读取SQLite数据库REAL类型值并转为double或float
问题根因
你遇到的问题本质是两个常见的SQLite数值读取坑:
- SQLite是动态类型系统,即便你声明列类型是REAL,实际写入时也可能存储为TEXT格式,如果写入时用了逗号作为小数点的区域格式,读取时默认用小数点(.)作为分隔符的转换逻辑会把逗号识别为千位分隔符,直接截断小数部分
- 部分版本的System.Data.SQLite驱动对REAL类型的直接
GetDouble映射存在兼容问题,会报specified cast is not valid错误
解决方法
第一步 先确认列实际存储格式
先执行下面的SQL查询确认存储类型和值:
SELECT typeof(KDRatio), KDRatio FROM doubles LIMIT 1
对应解决方案
如果查询显示typeof结果为TEXT,值是带逗号的格式(如1,99)
通过字符串替换+指定不变区域转换的方式读取:
using System.Globalization; // 读取逻辑替换为下面的代码 string kdRatioStr = sqlReader["KDRatio"].ToString().Replace(',', '.'); double nbr = Convert.ToDouble(kdRatioStr, CultureInfo.InvariantCulture);
如果查询显示typeof结果为REAL
优先通过decimal中转避免直接转换报错:
int kdIndex = sqlReader.GetOrdinal("KDRatio"); double nbr = Convert.ToDouble(sqlReader.GetDecimal(kdIndex));
额外优化建议
你的数据库连接、命令、DataReader都建议用using块包裹,会自动释放资源,不需要手动调用Close(),避免异常场景下资源泄漏:
public static void GetDouble() { using (SQLiteConnection databaseConnection = new SQLiteConnection($"Data Source=.\\val.sqlite;Version=3;")) using (SQLiteCommand sqlCommand = databaseConnection.CreateCommand()) { sqlCommand.CommandText = "SELECT KDRatio FROM doubles"; // 不要用SELECT *,按需取列更高效 databaseConnection.Open(); using (SQLiteDataReader sqlReader = sqlCommand.ExecuteReader()) { while (sqlReader.Read()) { string kdRatioStr = sqlReader["KDRatio"].ToString().Replace(',', '.'); double nbr = Convert.ToDouble(kdRatioStr, CultureInfo.InvariantCulture); Console.WriteLine(nbr); } } } }
内容的提问来源于stack exchange,提问作者Eddd
相关产品推荐
相关产品推荐

