Как получить значение NULL для DateTime? - PullRequest
0 голосов
/ 09 января 2019

В моей базе данных SQL я объявил DpsDate и AdmDate как DATE, также я установил их для разрешения пустых значений. Когда я запускаю свое приложение и оставляю эти столбцы пустыми, я получаю эту ошибку:

Не удалось преобразовать значение параметра из String в DateTime.

Это то, где я немного запутался, потому что я установил их так, чтобы они разрешали пустые значения, так что база данных не должна принимать никаких значений? Приложение работает, если я установил обе даты на «01.01.1900». Я попытался установить их на "00/00/0000", но я получаю ту же ошибку.

Вот что у меня есть:

        If tbNotifyDate.Text = "" Then
            cmd.Parameters.Add("@DpsDate", SqlDbType.Date, 50).Value = "01/01/1900"
        Else
            cmd.Parameters.Add("@DpsDate", SqlDbType.Date, 50).Value = tbNotifyDate.Text
        End If

        If tbAdmDate.Text = "" Then
            cmd.Parameters.Add("@AdmDate", SqlDbType.Date, 50).Value = "01/01/1900"
        Else
            cmd.Parameters.Add("@AdmDate", SqlDbType.Date, 50).Value = tbAdmDate.Text
        End If

1 Ответ

0 голосов
/ 09 января 2019

Вам необходимо использовать DBNull.Value для представления NULL в ADO.NET. Такие вещи, как адаптеры таблиц и Entity Framework, построенные на основе ADO.NET, могут поддерживать типы значений, допускающие значение NULL, и, таким образом, использовать Nothing для представления NULL, но сам ADO.NET предшествует типам значений NULL, поэтому Microsoft пришлось изобрести введите специально для представления NULL.

Я бы предложил использовать оператор If, чтобы сделать код более лаконичным:

Dim value As Date

cmd.Parameters.Add("@AdmDate", SqlDbType.Date).Value = If(Date.TryParse(tbAdmDate.Text, value),
                                                          value,
                                                          CObj(DBNull.Value))

CObj требуется, потому что два возможных результата If должны быть одного типа, а Date и DBNull не одного типа. Приведение одного возможного результата к типу Object, они оба интерпретируются как тип Object, и компилятор счастлив.

Обратите внимание, что, как я написал в этом примере, это сэкономит NULL, если TextBox содержит что-то, что не является допустимым представлением Date. Вы можете использовать любую валидацию, подходящую для вашего конкретного случая, или, если вы уже проверили, просто проверьте наличие пустого TextBox и используйте CDate.

...