为什么这个指定的演员无效?

时间:2014-02-07 04:34:05

标签: c# sql floating-point sqldatareader

enter image description here

我使用以下代码将数据从sql reader映射到C#Objects。在代码和sql数据库中,Power的数据类型为float .. y是否会出现转换错误消息?

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;
    }

3 个答案:

答案 0 :(得分:10)

我猜这个值是以框double而不是float的形式返回的。尝试使用

 (float) dataReader.GetDouble(fieldOrdinal);

请参阅Mapping CLR Parameter Data

答案 1 :(得分:5)

我会很好地预测返回的数据类型实际上是(盒装)双倍。

更新: 其实我刚发现一个SQL float映射到MSDN上的.NET double(所以这是你的问题):http://msdn.microsoft.com/en-us/library/ms131092.aspx < / p>

试试这个作为测试:

(float)dataReader.GetDouble(fieldOrdinal);

答案 2 :(得分:2)

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

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