Работа с обнуляемым DateTime - PullRequest
4 голосов
/ 17 июня 2011

Я использую LINQ, и у меня есть несколько свойств, которые DateTime? типа.

Если я теперь хочу добавить значение из текстового поля, я не могу заставить его работать.

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ScoringLastUpgrade", DbType="Date")]
public System.Nullable<System.DateTime> ScoringLastUpgrade

Текстовое поле, которое я использую, я убедился с помощью javascript, что формат будет '2011-06-17'

Но теперь, когда я пытаюсь сделать это:

myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text).ToShortDateString();

Я получаю эту ошибку: «Не удается преобразовать строку типа в DateTime?»

Как это сделать?

Ответы [ 4 ]

3 голосов
/ 17 июня 2011

Вызов .ToShortDateString() преобразует его в строку. Вы должны удалить этот вызов.

Кроме того, вы говорите, что убедились в формате с помощью javascript. Что, если у пользователя нет javascript, вы должны также выполнить проверки на стороне сервера. Кроме того, поскольку он в заданном формате, вы можете использовать DateTime.ParseExact или DateTime.TryParseExact (поэтому недопустимый формат не вызывает исключения), поскольку он более эффективен. (Строка формата будет "yyyy-MM-dd") Я верю.

2 голосов
/ 17 июня 2011

Не преобразовывайте его в строку, используя ToShortDateTimeString, просто установите результат Convert.ToDateTime:

myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text);

Предполагая, что вы провели достаточную проверку txtScoringUpgradeDate.Text?

При работе с этими преобразованиями типов я предпочитаю использовать метод TryParse, например:

DateTime date;
if (DateTime.TryParse(txtScoringUpgradeDate.Text, out date))
    myObject.ScoringLastUpgrade = date;

Convert.ToDateTime, так же как и явный DateTime.Parse, выдаст InvalidCastException, когда исключительныйзначение происходит.Лучше сделать ваш код неисправным, чем толерантным, а затем поймать исключение.

ОБНОВЛЕНИЕ : на основе вашего последнего комментария:

Вы не должны возвращать DateTime.MinValue в этомрегистр, так как MinValue меньше поддерживаемого минимального значения столбца datetime.CLR DateTime поддерживает диапазон дат вплоть до 0000-01-01, тогда как SQL datetime (а также сравнительный тип CLR SqlDateTime) поддерживает минимальное значение 1753-01-01.Так как он может иметь значение DateTime со значением NULL, вам следует установить значение NULL:

public static DateTime? ToNullableDateTime(this string date)
{
    DateTime dateTime;
    return (DateTime.TryParse(date, out dateTime))
        ? (DateTime?)dateTime
        : null;
}
0 голосов
/ 01 ноября 2017

В моем случае (.cshtml):

<td>@item.InvoiceDate.Value.ToShortDateString().ToString()</td>

Где InvoiceDtae - дата, допускающая обнуление в БД

0 голосов
/ 17 июня 2011

Проблема в том, что вы поставили ToShortDateString() в конце, эффективно преобразовав DateTime обратно в string снова.Попробуйте удалить эту часть строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...