【问题标题】:why is this specified cast not valid??为什么这个指定的演员阵容无效?
【发布时间】:2014-02-07 04:34:04
【问题描述】:

我使用以下代码将数据从 sql reader 映射到 C# 对象。 Power 在代码和 sql 数据库中都是数据类型 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;
    }

【问题讨论】:

标签: c# sql floating-point sqldatareader


【解决方案1】:

我猜该值是以装箱的double 而不是float 的形式返回的。尝试使用

 (float) dataReader.GetDouble(fieldOrdinal);

Mapping CLR Parameter Data

【讨论】:

  • 这意味着我还必须在我的代码中将所有属性更改为双倍?
  • 因此,如果我将所有属性更改为 double 并且正在使用 GetDoubleOrNull,那么我不必使用类型转换:(float)dataReader.GetDouble(fieldOrdinal) ryt?
  • 我刚试过..现在它给出了以下错误: System.Data.dll 中发生了“System.IndexOutOfRangeException”类型的异常,但未在用户代码中处理
  • 检查您的字段Ordinal。
【解决方案2】:

我敢打赌,返回的数据类型实际上是一个(装箱的)双精度。

更新:实际上我刚刚发现 SQL 浮点数映射到 MSDN 上的 .NET 双精度(所以是的,这是你的问题):http://msdn.microsoft.com/en-us/library/ms131092.aspx

试试这个作为测试:

(float)dataReader.GetDouble(fieldOrdinal);

【讨论】:

  • @Sana.91 是的,我建议这样做。
  • 那我应该使用 get float 还是 null,或者 Get double 还是 null 方法?因为我的数据库中的数据类型是浮点数
  • @Sana.91 使用 GetDouble 或 null。当它到达 .NET 时,它是数据库中的一个浮点数,它是一个双精度数。您可以在我发布的链接中亲自查看它的映射方式。
  • 因此,如果我将所有属性更改为 double 并且正在使用 GetDoubleOrNull,那么我不必使用类型转换:(float)dataReader.GetDouble(fieldOrdinal) ryt?
  • @Sana.91 不,那就坚持双倍。不需要浮动。
【解决方案3】:

原因是 SQL Float 在 .net 中是 double 的。你可以看到完整的映射here。因此,正如其他人所建议的那样,您需要阅读 double 然后尝试将其转换为浮动。

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

【讨论】:

    猜你喜欢
    • 2014-04-05
    • 2015-10-23
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多