SQL - Вставить NULL в DateTime

У меня есть таблица, где я добавляю Datetime в некоторые столбцы. Я использую хранимую процедуру для вставки значений в таблицу. В хранимой процедуре у меня есть переменные, которые принимают значение null для вставки в таблицу. Моя проблема в том, что когда я пытаюсь вставить нулевое значение в столбец таблицы, я получаю 1900-01-01 в столбце. Что я делаю, вместо этого значения по умолчанию в столбце colulmn отображается только NULL?

Это мой SP:

CREATE PROCEDURE dbo.Insert
@InserID int,
@InsertDate Datetime = null,
AS
Insert into Tables(InsertID, InsertDate)
Values(@InsertID, @InsertDate)

Я делаю это, чтобы назначить нулевое значение:

System.Data.SqlTypes.SqlDateTime getDate;
//set DateTime null
getDate = SqlDateTime.Null;

if (InsertDate.Text == "")
{
cmd1.Parameters["@InsertDate"].Value = getDate;
}
else
{
cmd1.Parameters["@InsertDate"].Value = InsertDate.Text;
}

Значение, добавляемое в мой столбец таблицы, не NULL, его 1900-01-01.

Что мне делать?

Ответ 1

Я использую этот шаблон, и у меня нет проблем с нулями или несовместимым текстовым форматом.

cmd1.Parameters.Add["@InsertDate"].Value = textBox1.Text.AsDBDateTime();
// ...
public static class DBValueExtensions {
    public static object AsDBDateTime(this string s) {
        object dateTimeValue;
        var str = s;
        if ( null != str ) { str = str.Trim(); }

        if ( string.IsNullOrEmpty(str) ) {
            dateTimeValue = DBNull.Value;
        }
        else {
            dateTimeValue = DateTime.Parse(str);
        }

        return dateTimeValue;
}

Ответ 2

Вы можете полностью опустить необязательные параметры, а не устанавливать их на SqlDateTime.Null.

Сказав это, код все равно должен работать. Как вы читаете базу данных? Некоторые телезрители отображают 1900-01-01 для null. Что вы видите при запуске select * from Tables из SQL Server Management Studio?

Ответ 3

Я подозреваю, что есть неявное преобразование из DBNull в 0 для вашей даты, потому что DateTime по умолчанию не имеет значения NULL. Это будет воспроизводить поведение, которое вы видите.

lol, только что увидев ответ Addomar, если столбец в SSMS не является фактически нулевым, но фактически равен нулю, и вы не можете изменить схему базы данных (иногда это невозможно), тогда подход ниже будет работать...

Вы можете попробовать что-то вроде datacolumn datagridview заменить определенное значение, чтобы заменить нулевое значение каким-то другим текстом или пустой строкой?

Но в идеале измените столбец на нулевое значение без значения по умолчанию и опустите параметр, когда он должен быть нулевым.

Ответ 4

Я попробовал это в SSMS

declare @InsertDate datetime

set @InsertDate = '   '

select @InsertDate

который возвращает 1900-01-01 00:00:00.000

поэтому другая возможность - ваш ввод - это пробел. Попробуйте использовать

if (string.IsNullOrWhiteSpace(InsertDate.Text))

вместо

if (InsertDate.Text == "")