2017-02-14 7 views
0

私はDataTableのデータをグループ化し、LINQを使用して1列を合計していますを入力しDBNull.Valueのをキャストすることはできませんが、実行時私は取得エラーは、「可能System.Int32

がDBNull.Valueのをキャストすることはできませんというエラーを取得していながら、 「System.Int32」と入力します。私はしたくない

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

二行目でエラーを取得しています私のコード

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()))}) 

が親切にヌルvalue.Iを取って回避する方法を私に示唆された以下の「NULL可能タイプを使用してください

+0

私はこの問題がInstitutionalInvestorStyleIDだと考えています。これがデータベースでNULL可能であるかどうかを確認してください。 'v.Field(Integer?)(" InstitutionalInvestorStyleID ")' – shadow

答えて

0

DataTablesはNULL値を格納せず、代わりにDBNullを格納します。

IsNothingは役に立ちません。

したがって、DBNull.Value(DBNullのシングルトン)と比較する必要があります。

0

このような何か試してみてください:エラーメッセージは、あなたがグループ化しながら、キャストしようとしている列にNULL値を持っているためであるので、単にNullableタイプに変更し

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"))))}) 
+0

お試しいただきありがとうございます。私は今何かエラーが出ていませんが、スタイルネームがヌルか ""であれば、その行を取ることは望ましくありません。 –

0

を。また、null値は、このような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.

関連する問題