C#无法转换SQL Server SELECT语句中的计算列问题求助
解决C#读取SQL计算列时的InvalidCastException问题
嘿,我来帮你搞定这个转换报错的问题~
问题根源
你SQL里计算的Yield列是**NUMERIC(38,2)**类型,而SQL Server的NUMERIC/DECIMAL类型在.NET中对应的是decimal,不是float。直接用(float)reader["Yield"]强制转换会触发InvalidCastException,因为这两种数值类型不能直接跨类型强制转换。
几种可行的解决方案
方案一:修改C#转换逻辑,先转decimal再转float
把你的转换代码改成这样:DBYield = (float)(decimal)reader["Yield"];先把数据库返回的decimal值转成decimal类型,再转换成float,就能避开强制转换的报错。
方案二:在SQL语句里直接把结果转成float类型
调整你的SELECT语句,把计算结果转换成float,这样从数据库读取时就是float类型,直接转换就没问题:SELECT TotalUnique, TotalFail, ISNULL(((TotalUnique - NullIf(TotalFail, 0)) / CONVERT(FLOAT, TotalUnique) * 100), 100) AS Yield FROM Products方案三:使用DataReader的强类型获取方法(更安全)
用GetDecimal先获取decimal值,再转成float,同时用GetOrdinal避免列名拼写错误的问题:DBYield = (float)reader.GetDecimal(reader.GetOrdinal("Yield"));
额外小提示
如果你的业务对百分比精度要求较高,建议直接在C#里用decimal类型存储Yield,毕竟float存在精度丢失的风险。比如把float DBYield = 00.0f;改成decimal DBYield = 0.0m;,然后直接转换:
DBYield = (decimal)reader["Yield"];
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

