【问题标题】:Getting error Cannot cast DBNull.Value to type 'System.Int32出现错误无法将 DBNull.Value 转换为类型“System.Int32”
【发布时间】:2017-07-02 17:06:27
【问题描述】:

我正在对数据表中的数据进行分组,并使用 linq 对一列进行汇总,但是在运行时我收到错误提示

无法将 DBNull.Value 转换为类型 'System.Int32。请使用可空类型”下面是我的代码

Dim resultStyle = invData.Tables(0).AsEnumerable() _
      .GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer)("InstitutionalInvestorStyleID"), Key .StyleName = Not IsNothing(v.Field(Of String)("InstitutionalInvestorStyleName"))}) _
      .Select(Function(v) New With {Key .InvestorStyleID = v.Key.InvestorStyleID, Key .StyleName = v.Key.StyleName, Key .Sum = v.Sum(Function(r) Double.Parse(r.Item("k001ICGeo").ToString()))})

请建议我如何避免使用空值。我在第二行遇到错误

.GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer)("InstitutionalInvestorStyleID"), Key .StyleName = Not IsNothing(v.Field(Of String)("InstitutionalInvestorStyleName"))}).

我不想取空值。

【问题讨论】:

  • 我认为问题出在机构投资者样式 ID。检查这在数据库中是否可以为空。试试v.Field(Of Integer?)("InstitutionalInvestorStyleID")

标签: asp.net vb.net linq


【解决方案1】:

DataTables 不存储空值,而是存储DBNull

因此,您的IsNothing 没有帮助。

因此,您需要与DBNull.Value(DBNull 的单例)进行比较。

【讨论】:

    【解决方案2】:

    试试这样的:

    Dim resultStyle = invData.Tables(0).AsEnumerable() _
                            .GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer?)("InstitutionalInvestorStyleID").GetValueOrDefault, 
                                                            Key .StyleName = If( String.IsNullOrEmpty(v.Field(Of String)("InstitutionalInvestorStyleName")),"", v.Field(Of String)("InstitutionalInvestorStyleName"))}) _
                            .Select(Function(v) New With {Key .InvestorStyleID = v.Key.InvestorStyleID, Key .StyleName = v.Key.StyleName, Key .Sum = v.Sum(Function(r) Convert.ToDouble(r.Item("k001ICGeo"))))})
    

    【讨论】:

    • 感谢您的帮助。我现在没有收到任何错误,但如果样式名称为 null 或“”,我不想采用该特定行。如何避免采用该行。
    【解决方案3】:

    错误消息是因为您在分组时尝试强制转换的列中有空值,因此只需将其更改为 Nullable 类型。此外,要仅获取不具有空值的记录,请使用 Where 子句应用过滤器,如下所示:-

    Dim resultStyle = invData.Tables(0).AsEnumerable() _
        .GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer?)("InstitutionalInvestorStyleID"), Key .StyleName = Not IsNothing(v.Field(Of String)("InstitutionalInvestorStyleName"))}) _
        .Where(Function(x) x.Key.InvestorStyleID  IsNot Nothing) _
        .Select(Function(v) New With {Key .InvestorStyleID = v.Key.InvestorStyleID, Key .StyleName = v.Key.StyleName, Key .Sum = v.Sum(Function(r) Double.Parse(r.Item("k001ICGeo").ToString()))})
    

    我还添加了一个示例小提琴来展示它如何处理一些示例数据。

    Fiddle.

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2021-12-07
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多