6

rows.AsEnumerable() から選択するとエラーが発生します。次のコードを使用しています...

var rows = ds.Tables[0].AsEnumerable();
                trafficData = rows.Select(row => new tdDataDC
                {
                    CalculationCount = row.Field<Int64>("biCalculationCountSeqID")
                    , Zone = row.Field<Int16>("siFkZoneId")
                    , Miles = row.Field<decimal>("dcMiles")
                    , Plaza = row.Field<Int16>("siFkPlazaId")
                    , VehicleCount = row.Field<int>("iVehicleCount")


                });

ほとんどの場合はうまく機能しますが、データベースに NULLS があると、「DBNull.Value を 'System.Int16' 型にキャストできません。null 許容型を使用してください..」というエラーが表示されます。これを修正するにはどうすればよいですか? データコントラクトに Nullable 型を持たせたくありません。3 進数か何かを使用したいのですが、値が NULL の場合は 0 を使用してください。これは可能ですか?

助けてくれてありがとう、
~ck

4

4 に答える 4

11

いつでも別の拡張メソッドを追加できます(テストされていません):

   public static T FieldOrDefault<T>(this DataRow row, string columnName)
   {
       return row.IsNull(columnName) ? default(T) : row.Field<T>(columnName);   
   }

次に、コールサイトは次のようになります。

var rows = ds.Tables[0].AsEnumerable();
                trafficData = rows.Select(row => new tdDataDC
                {
                    CalculationCount = row.FieldOrDefault<Int64>("biCalculationCountSeqID")
                    , Zone = row.FieldOrDefault<Int16>("siFkZoneId")
                    , Miles = row.FieldOrDefault<decimal>("dcMiles")
                    , Plaza = row.FieldOrDefault<Int16>("siFkPlazaId")
                    , VehicleCount = row.FieldOrDefault<int>("iVehicleCount")


                });
于 2010-06-29T23:32:48.847 に答える
7

nullをテストする方法は次のとおりです...

Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
于 2010-06-29T23:20:00.390 に答える
1

私は??演算子がかなり好きです:

CalculationCount = row.Field<Int64?>("biCalculationCountSeqID") ?? 0
                , Zone = row.Field<Int16?>("siFkZoneId") ?? 0
                , Miles = row.Field<decimal?>("dcMiles") ?? 0.0m
                , Plaza = row.Field<Int16?>("siFkPlazaId") ?? 0
                , VehicleCount = row.Field<int>("iVehicleCount") 0;
于 2012-08-07T17:08:46.280 に答える