0

我正在使用从 Oracle 数据库中读取多个日期并将其分配给DateTimePickers.

dtpAdjSerDt.Value = dr.GetDateTime(iadj_service_date);

但是,此分配需要进行空检查,因为 db 中的值可能是null.

如果值为空,我希望能够创建一个返回默认值的扩展方法。

public static DateTime fSafeGetDateTime(OracleDataReader reader, int colIndex)
{
    if (!reader.IsDBNull(colIndex))
        return reader.GetDateTime(colIndex);
    else
        return DateTime.Now;
}

这种方法存在一个问题:如果 db 值为 null,则 DateTimePicker.Checked 应该为 false。但是使用我上面建议的策略,它将被设置为 true。

有没有办法让我做这样的事情:

public static DateTime fSafeGetDateTime(OracleDataReader reader, int colIndex, DateTimePicker control)
{
    if (!reader.IsDBNull(colIndex))
        return reader.GetDateTime(colIndex);
    else
    {
        control.Checked = false;
        return DateTime.Now;
    }
}

如果这是不可能的,那么最干净的方法(避免重复代码)是什么?

4

1 回答 1

2

我建议您只返回 aDateTime?并让调用者执行默认操作:

public static DateTime? SafeGetDateTime(this OracleDataReader reader, int colIndex)
{
    return reader.IsDBNull(colIndex) ? null 
                                     : (DateTime?) reader.GetDateTime(colIndex);
}

现在您可以使用:

DateTime fromReaderOrNow = reader.SafeGetDateTime(1) ?? DateTime.Now;

如果您需要控制部分:

DateTime? fromReader = reader.SafeGetDateTime(1);
if (fromReader == null)
{
    control.Checked = false;
}
DateTime fromReaderOrNow = fromReader ?? DateTime.Now;

如果你真的需要在多个地方这样做,你可以总结一个方法来做——你不会重复SafeGetDateTime代码。

(老实说,我鼓励您将我们的数据库代码与您的 UI 代码进一步分开。)

于 2013-07-30T22:42:31.040 回答