Что является стандартным способом обработки нулевых дат в .NET - PullRequest
4 голосов
/ 15 марта 2011

У меня есть форма asp.net с C #, где я беру информацию о пользователе для вставки в базу данных, как обычно, используя Linq. Что ж. Где, поскольку я беру дату рождения также от пользователя, но если пользователь пропустит заполнение текстового поля даты из пользовательского интерфейса, то я получаю дату вроде '01 / 01/0001 'примерно так, что, безусловно, не позволит хранить его.

Так что мне нужно проверить где-нибудь в моем коде, что он нулевой или в этом (указанном выше) формате. Если он нулевой или в формате «01/01/0001», то что именно я должен сделать? У меня нет по умолчанию значение для дат.

Так что же является стандартным способом обработки, если дата нулевая (но не обязательная). Пожалуйста, направьте меня. Так много раз я попадал в ловушку, обрабатывая ноль для различных типов.

Отредактировано Посмотрите, что я сделал, кажется, это работает здесь. но я не думаю, что это стандартный способ:

DateTime? otxtDOB = new DateTime();
                    if (!string.IsNullOrEmpty(DOB))
                    {
                    if (Convert.ToDateTime(DOB) != DateTime.MinValue)
                        {
                        otxtDateOfPurchese = Convert.ToDateTime(Convert.ToDateTime(DOB).ToString("dd-MMM-yyyy"));
                        }
                    else
                    {
                     otxtDOB = null;
                        }

                    }

Пожалуйста, подтвердите мне, что это правильный путь?

Ответы [ 7 ]

11 голосов
/ 15 марта 2011

Создание свойства даты Nullable (то есть "DateTime?") должно позволить ему фактически быть нулевым, если пользователь не установил его.(И при условии, что в вашем столбце базы данных будут пустые значения, он может быть сохранен как нулевой в базе данных)

В противном случае по умолчанию он будет равен DateTime.MinValue, что вы видите здесь.При добавлении в базу данных вам понадобится проверка на четкость для DateTime.MinValue.

0 голосов
/ 02 августа 2013
obj.BirthDate = Convert.ToDateTime(string.IsNullOrEmpty(txtBirthDate.Text.ToString()) ? System.Data.SqlTypes.SqlDateTime.MinValue.Value : Convert.ToDateTime(txtBirthDate.Text.ToString()));
0 голосов
/ 15 марта 2011

use

DateTime dt; 
if(DateTime.TryParse(DatetImeValue.Tostring(),dt))   // datetimevalue is your db value
{
     datetimeproperty = dt;   // in your class declare it as DateTime? datetimeproperty 
}
else
{
    datetimeproperty = null;
}

При отображении проверки на нулевое значение, если его значение null установлено пустым.

[Update]

Сделай одну вещь, Сделай свойство обнуляемым.В вашей базе данных.Задайте для поля значение null и в параметре user @DateTimeParam = null.

ИЛИ БЫСТРОЕ ВРЕМЯ РАБОТЫ СДЕЛАЙТЕ ПОЛЕ БАЗЫ ДАННЫХ И ПАРАМЕТР ВМЕСТО В ДАННЫХ, В ПАРАМЕТРЕ PASS DATETIMEVALUE.TOSHORTATИ ТАКЖЕ ПРОВЕРИТЬ, ПОЛЬЗУЕТСЯ ЛИ ВЫ, ЧТОБЫ ПОЛЬЗОВАТЕЛЬ ПОСТАВИЛ В ПАРАМЕТРЕ STRING.EMPTY.В ЭТОМ СПОСОБЕ ВАМ БУДЕТ ЛЕГКО ОТОБРАЖАТЬ ДАТУ И ВРЕМЯ.ВАМ НЕ НУЖНО ЛИШИТЬСЯ ИЛИ СТРАТЬ С ЧАСТИ ВРЕМЕНИ, ЕСЛИ ЭТО НЕ НУЖНО

0 голосов
/ 15 марта 2011

вы можете сделать что-то вроде этого в C #, иметь некоторые функции, такие как обнуляемый тип, который вы можете использовать это сэкономит вам часть кода и будет более надежным.

Public int InsertData(int? ouId)
{

chkValue = ouId.HasValue ? ouId.Value : 0;
} 
0 голосов
/ 15 марта 2011

У вас есть возможность использовать Nullable<DateTime> (псевдоним DateTime?). Это позволяет вам обрабатывать дату как нулевую во всем приложении.

Тем не менее, лично я не нахожу для nullables и предпочел бы этот второй путь: вы можете использовать DateTime.MinValue (который является 01/01/0001) в качестве значимой константы в вашем приложении и проверки DateTime.MinValue ваш уровень доступа к данным.

База данных, если это SQL Server и поле имеет тип smalldatetime, переполнится и выдаст исключение, если вы попытаетесь сохранить DateTime.MinValue. Null, однако, вполне может храниться в базе данных для любого типа.

Вот как вы можете разобрать ваши строки в обнуляемые типы:

private delegate bool TryParseDelegate<T>(string s, out T t);
private static T? TryParseNullable<T>(string s, TryParseDelegate<T> tryParse) where T : struct
{
   if (string.IsNullOrEmpty(s))
       return null;
   T t;
   if(tryParse(s, out t))
      return t;
   return null;
}

с использованием:

var nullableDateTime = TryParseNullable<DateTime>("01/01/0001", DateTime.TryParse);
0 голосов
/ 15 марта 2011

DateTime - это тип значения (например, число), поэтому вы не можете присвоить ему нулевое значение. Мане используют взамен DateTime.MinValue или DateTime.MaxValue, но я предпочитаю использовать обнуляемые типы:

DateTime? nullableDate;
dateSample.Value = null;
0 голосов
/ 15 марта 2011

Вы можете использовать это при передаче в базу данных.

object datetimeObj = null;
if (datetimefromUI == DateTime.MinValue) // This is put in the DateTime object by default
    datetimeObj = DBNull.Value;
else
    datetimeObj = datetimefromUI;

// Post datetimeObj to parameter in database...
...