2

このサイトで見つけた一般的な DataTable から List への変換メソッドを使用しています。

private List<T> ConvertToList<T>(DataTable dt)
        {
            var columnNames = dt.Columns.Cast<DataColumn>()
                .Select(c => c.ColumnName)
                .ToList();

            var properties = typeof(T).GetProperties();

            return dt.AsEnumerable().Select(row =>
            {
                var objT = Activator.CreateInstance<T>();

                foreach (var pro in properties)
                {
                    if (columnNames.Contains(pro.Name))
                    {
                            pro.SetValue(objT, row[pro.Name], null);
                    }
                }

                return objT;
            }).ToList();

        }

pro.SetValue で整数フィールドの null 値をヒットした場合を除いて、うまく機能します。失敗する理由は、pro.SetValue(objT, null,null) のように 2 番目のパラメーターが null の場合、pro.SetValue が型の既定値を設定するためです。しかし、私のrow[IdColumn]はnullではなく空のオブジェクト{}を返します。私が得ているエラーは次のとおりです。

タイプ 'System.DBNull' のオブジェクトは、タイプ 'System.Nullable`1[System.Int32]' に変換できません。

使用時int?

タイプ 'System.DBNull' のオブジェクトは、タイプ [System.Int32]' に変換できません。

int この場合の処理​​方法を教えてください。

4

2 に答える 2

5

最初に null を確認します。

pro.SetValue(objT, row.IsNull(pro.Name) ? null : row[pro.Name], null);
于 2012-10-12T21:13:58.233 に答える
1

おそらく DBNull を明示的にチェックする必要があります

if (columnNames.Contains(pro.Name))
{
    if (row.IsNull(pro.Name))
        pro.SetValue(objT, null, null);
    else
        pro.SetValue(objT, row[pro.Name], null);
}

これは を処理しますが、(null 非許容)int?に変換しようとするとエラーになるはずです。nullInt32

于 2012-10-12T21:15:01.253 に答える