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

C#读取SQLite中带逗号的REAL类型值返回0的解决方法

解决SQLite REAL列带逗号格式值读取为0的问题

我来帮你搞定这个问题!你遇到的情况其实是区域文化设置和SQLite弱类型特性共同导致的:

问题根源

SQLite本身是弱类型数据库,哪怕你把列定义为REAL,它也允许存储字符串格式的数值(比如带逗号的123,23)。而.NET的SQLite驱动在读取这类值时,会默认按照当前线程的区域文化(比如用点作为小数点的en-US)尝试解析成数值,当遇到逗号作为小数点的字符串时,解析失败就会返回0。

另外,如果插入数据时直接把带逗号的字符串写入REAL列,也可能因为区域不匹配导致存储的数值异常,最终读取时得到0。

解决方案

根据你的场景,这里有几个可行的办法:

1. 强制以字符串形式读取原始值

跳过驱动的自动数值解析,直接读取数据库里存储的原始字符串内容,这样就能拿到带逗号的数值:

// 替换原来的 reader["P_Unit"].ToString();
int ordinal = reader.GetOrdinal("P_Unit");
tempLast.Price = reader.IsDBNull(ordinal) ? "" : reader.GetString(ordinal);

这种方法适合数据库里确实存储了带逗号的字符串形式数值的情况。

2. 在查询时转换格式

直接在SQL语句里把逗号替换成点,让驱动能正确解析成数值,之后再按需格式化:

SELECT Cod_art, Descricao, ..., REPLACE(P_Unit, ',', '.') AS P_Unit, ... FROM Ajuda_Compras WHERE Cod_Art = @prodCod

然后读取的时候可以正常转成数值再格式化:

// 先转成数值,再按需要的区域格式输出带逗号的字符串
decimal price = Convert.ToDecimal(reader["P_Unit"]);
tempLast.Price = price.ToString("N2", new System.Globalization.CultureInfo("pt-PT")); // 葡萄牙语区域用逗号当小数点

3. 临时修改线程区域文化(不推荐全局修改)

如果你的整个应用都需要用逗号作为小数点的区域(比如欧洲多国),可以在读取数据前临时设置线程的区域文化:

// 保存当前区域
var originalCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
// 设置为支持逗号小数点的区域,比如葡萄牙语
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("pt-PT");

// 这里执行你的读取逻辑
using (SQLiteDataReader reader = cmd.ExecuteReader()) {
    // ... 读取代码 ...
}

// 恢复原来的区域
System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture;

这种方法适合全局都需要用逗号小数点的场景,但要注意可能影响其他功能的格式化逻辑。

额外建议

最好检查一下数据插入的逻辑,确保插入REAL列时是用数值类型(比如decimal、double)而不是带逗号的字符串,这样能从根源避免存储异常。比如插入时用参数化查询,直接传入数值而不是字符串,SQLite会正确存储为REAL类型,后续读取就不会有解析问题了。


内容的提问来源于stack exchange,提问作者Camadas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:44