1

SQL からデータテーブルに日時フィールドを読み取るときに、次の問題があります。
クエリは正常に動作しますが、foreach ループに到達すると、日時フィールドの null 値について不平を言います。

次のように定義されたクラスがあります。

public class trading_book_product_IRS        
    {
        public DataTable dt_IRS { get; set; }

        public string account_deal_position_id { get; set; }
        public DateTime schedule_start_date { get; set; }
        public DateTime schedule_end_date { get; set; }
        public string repricing_type { get; set; }
        public string coupon_type { get; set; }
        public string reference_curve { get; set; }
        public string reference_curve_point { get; set; }
        public decimal interest_rate { get; set; }
        public decimal interest_rate_spread { get; set; }        
}

以下を使用してデータテーブルを作成します。この方法で行うため、使用できませんDateTimeか?

public static DataTable CreateDataTable(Type animaltype)
    {
        DataTable return_Datatable = new DataTable();
        foreach (PropertyInfo info in animaltype.GetProperties())
        {
            if (!info.Name.StartsWith("dt_"))
            {
                return_Datatable.Columns.Add(new DataColumn(info.Name, info.PropertyType));
            }
        }
        return return_Datatable;
    }

次に、クエリを実行して結果を書き込むことを期待していますが、DateTime が null であることを処理できません。私がやろうとしているのは、datetime が null の場合、日付を 99990101 にすることです。問題は、schedule_end_date および schedule_start_date フィールドにあります。

 var query =
            from result in t_sdi_trading_book_product_interest_repricing_schedule_hsbc.AsEnumerable()
            where result.sdi_control_id == sdi_id
            && accountDealIDs.Contains(result.account_deal_position_id)
            select new trading_book_product_IRS()
            {
                account_deal_position_id = result.account_deal_position_id,
                coupon_type = result.coupon_type,
                interest_rate = result.interest_rate,
                interest_rate_spread = result.interest_rate_spread,
                reference_curve = result.reference_curve,
                reference_curve_point = result.reference_curve_point,
                repricing_type = result.repricing_type,
                schedule_end_date = !string.IsNullOrEmpty(result.schedule_end_date.ToString()) ? result.schedule_end_date : DateTime.Parse("99990101"),
                schedule_start_date = !string.IsNullOrEmpty(result.schedule_start_date.ToString()) ? result.schedule_start_date : DateTime.Parse("99990101"),
            };

        foreach (var results in query)
        {
            foreach (PropertyInfo result in results.GetType().GetProperties())
            {

                string name = result.Name;

                foreach (PropertyInfo info in used.GetType().GetProperties())
                {
                    if ((result.Name == info.Name) && (!result.Name.StartsWith("dt_")))
                    {
                        try
                        {
                            info.SetValue(used, result.GetValue(results, null), null);
                        }
                        catch (NoNullAllowedException e)
                        {
                        }

                    }
                }
            }
            dt_IRS.Rows.Add(makeRow(used, dt_IRS));
        }
4

5 に答える 5

2

あなたの問題は、プロパティが割り当てられているかどうかに関係なく、プロパティschedule_end_dateを呼び出そうとするため、プロジェクションが常にschedule_start_date例外をスローするかどうかです。nullToString

次のようなことをする必要があります

schedule_end_date = result.schedule_end_date ?? DateTime.Parse("..."),
schedule_start_date = result.schedule_start_date ?? DateTime.Parse("...")


アップデート

result.schedule_end_date/result.schedule_start_dateが実際には null 可能ではないという啓示に基づいて、日付がnullまったくかどうかを実際に確認することはできません。ほとんどの場合、データがnullDB 側にある場合、何かnullがを有効な に変換していますDateTime

ほとんどの ORM は に変換nullされDateTime.MinValueます。


Linq to SQL を使用している場合は、CanBeNullプロパティを属性trueに設定する必要もあります。Column

[Column(CanBeNull=true)]
public DateTime? schedule_start_date;

[Column(CanBeNull=true)]
public DateTime? schedule_end_date;

次に、null 合体演算子を使用してデフォルト値を設定できます。

schedule_end_date = result.schedule_end_date ?? DateTime.ParseExact("yyyyMMdd", "99990101", CurrentCulture.InvariantCulture),
schedule_start_date = result.schedule_start_date ?? DateTime.ParseExact("yyyyMMdd", "99990101", CurrentCulture.InvariantCulture),
于 2013-09-17T13:09:19.550 に答える
1

を使用しても問題ありませんnullableCreateDataTableそれに対処するために関数を変更するだけです。

public class trading_book_product_IRS        
{
    public DataTable dt_IRS { get; set; }
    public string account_deal_position_id { get; set; }
    public DateTime? schedule_start_date { get; set; }
    public DateTime? schedule_end_date { get; set; }
    public string repricing_type { get; set; }
    public string coupon_type { get; set; }
    public string reference_curve { get; set; }
    public string reference_curve_point { get; set; }
    public decimal interest_rate { get; set; }
    public decimal interest_rate_spread { get; set; }        
}

public static DataTable CreateDataTable(Type type)
{
    var dataTable = new DataTable();
    foreach (PropertyInfo info in type.GetProperties())
    {
        if(info.PropertyType == typeof(DataTable)) continue;

        DataColumn column;

        var type = Nullable.GetUnderlyingType(info.PropertyType);

        if(type != null)
        {
            column = new DataColumn(info.Name, type)
        }
        else
        {
            column = new DataColumn(info.Name, info.PropertyType);
        }

        dataTable.Columns.Add(column);
    }

    return dataTable;
}

linq の内部:

schedule_end_date = result.schedule_end_date
schedule_start_date = result.schedule_start_date
于 2013-09-17T13:24:26.260 に答える
0

このようなものがうまくいくかもしれません:

result.schedule_end_date == null ? result.schedule_end_date : DateTime.Parse("01/01/1900")
于 2013-09-17T13:08:39.763 に答える
-2

使ったことがありますか

Nullable<DateTime>

編集:私はこれを取り下げません。私の素朴さで、私は考えNullable<DateTime>DateTime?異なっていて、コンパイラによって異なって解釈されました。IsDateTime?は以前のバージョンの省略形です。知らなかった他の誰かのための単なる参照...私は反対票を受け入れます。

于 2013-09-17T12:57:02.153 に答える