使用SQLite .NET存储double.MaxValue后读取变为正无穷的问题
解决SQLite存储double.MaxValue后读取为PositiveInfinity的问题
这个问题我之前也碰到过,核心原因是直接拼接SQL字符串传递数值导致的。当你把double.MaxValue转换成字符串(比如1.7976931348623157E+308)拼进SQL语句时,SQLite在解析这个字符串的过程中,会因为数值的文本解析逻辑,误将其判定为超出双精度浮点数的范围,最终存储成了PositiveInfinity。
解决方法其实很简单,改用参数化查询即可,让SQLite.NET库直接处理数值的二进制传递,跳过字符串转换的环节:
// 创建表t1 (value REAL) // ... 已完成数据库连接 // 改用参数化SQL,避免直接拼接数值字符串 var sql = "insert into t1(value) VALUES (@value)"; using (var command = new SQLiteCommand(sql, con)) { // 直接传递double类型的参数,无需转换为字符串 command.Parameters.AddWithValue("@value", double.MaxValue); command.ExecuteNonQuery(); }
这样修改后,SQLite会准确存储double.MaxValue的二进制值,后续执行查询读取时:
// SELECT * FROM t1 // ... 执行查询操作 var d = reader.GetDouble(0); // d 将正确等于 double.MaxValue
额外提一句:参数化查询不仅能解决这个数值精度/范围的问题,还能避免SQL注入风险,是数据库操作的最佳实践哦。
内容的提问来源于stack exchange,提问作者Simon Goodman
相关产品推荐
相关产品推荐

