为什么这个指定的强制转换无效?

3
我使用以下代码将数据从SQL Reader映射到C#对象。Power在代码和SQL数据库中都是float类型。为什么会出现强制转换错误信息?
private Entity.PanelDetail MapDataReader(SqlDataReader dataReader)
    {
        Entity.PanelDetail panelDetail = new Entity.PanelDetail();
        panelDetail.IdPanelDetail = DataReaderExtensions.GetStringOrNull(dataReader, "idPanelDetail");
        panelDetail.IdDeviceDetail = DataReaderExtensions.GetStringOrNull(dataReader, "idDeviceDetail");
        panelDetail.Power = DataReaderExtensions.GetFloatOrNull(dataReader, "Power");
        panelDetail.Current = DataReaderExtensions.GetFloatOrNull(dataReader, "Current");
        panelDetail.Length = DataReaderExtensions.GetFloatOrNull(dataReader, "Length");
        panelDetail.Width = DataReaderExtensions.GetFloatOrNull(dataReader, "Width");
        panelDetail.CreatedBy = DataReaderExtensions.GetStringOrNull(dataReader, "CreatedBy");
        panelDetail.CreationDate = DataReaderExtensions.GetDateTimeOrNull(dataReader, "CreationDate");
        panelDetail.ModifiedBy = DataReaderExtensions.GetStringOrNull(dataReader, "ModifiedBy");
        panelDetail.ModifiedDate = DataReaderExtensions.GetDateTimeOrNull(dataReader, "ModifiedDate");
        panelDetail.IsActive = DataReaderExtensions.GetBoolOrNull(dataReader, "IsActive");
        panelDetail.IsDeleted = DataReaderExtensions.GetBoolOrNull(dataReader, "IsDeleted");

        return panelDetail;
    }

可能是为什么SQL中的float与C#中的float不同的重复问题。 - Leo
3个回答

13

我猜测返回的值是打包的double,而不是float。尝试使用

 (float) dataReader.GetDouble(fieldOrdinal);

请查看CLR参数数据映射


那意味着我需要在我的代码中将所有属性更改为double类型吗? - Sana.91
如果我将所有属性更改为double并使用GetDoubleOrNull,那么我就不必使用类型转换:(float)dataReader.GetDouble(fieldOrdinal)对吗? - Sana.91
我刚刚尝试了一下,现在它出现了以下错误: 在用户代码中未处理的 System.Data.dll 中发生了类型为“System.IndexOutOfRangeException”的异常。 - Sana.91
请检查您的 fieldOrdinal。 - Sameer
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/46987/discussion-between-sameer-and-sana-91 - Sameer
Sameer,非常感谢您的指导...问题已经解决 :) - Sana.91

6
我猜返回的数据类型实际上是一个(装箱)双精度型。更新:实际上我刚刚发现SQL浮点数映射到.NET双精度浮点数(因此,这是你的问题):http://msdn.microsoft.com/en-us/library/ms131092.aspx。请尝试使用以下代码进行测试:(float)dataReader.GetDouble(fieldOrdinal);

@Sana.91 是的,我会推荐这样做。 - Timeout
那我应该使用Get Float或Null,还是Get Double或Null方法呢?因为我的数据库中的数据类型是浮点数。 - Sana.91
@Sana.91 使用GetDouble或null。在数据库中它是一个浮点数,但当它到达.NET时,它变成了双精度浮点数。您可以在我发布的链接中自行查看它的映射方式。 - Timeout
如果我将所有属性更改为double并使用GetDoubleOrNull,那么我就不必使用类型转换:(float)dataReader.GetDouble(fieldOrdinal),对吧? - Sana.91
1
@Sana.91 如果没有必要,就继续使用 double 类型。不需要使用 float。 - Timeout

3

原因是SQL Float在.net中是double。您可以在此处查看完整的映射表。因此,正如其他人建议的那样,您需要读取double,然后尝试将其转换为float。

(float)dataReader.GetDouble("Power");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接