Преобразуйте dbnull в строку. Записывать dbnull.value в базу данных вместо Nothing

У меня есть функция insertRecord в vb.net, которая использует запрос параметров. Если дата ошибки не указана, мне нужно вставить dbnull.value в базу данных вместо "" (ничего).

Dim strErrorDate2 As DateTime = Request.Form("dateOfErrorDatePicker2").ToString

.Add(New SqlParameter("@ErrorDate2", If(strErrorDate2 <> Nothing, strErrorDate2.Date, DBNull.Value)))

Я продолжаю получать ошибки преобразования dbnull в строку. Первоначально у него был собственный блок if / else, в котором я инициализировал переменную, но я не мог понять, как его правильно преобразовать. Я попробовал встроить if, но мне все равно нужно выполнить преобразование или попробовать что-то еще.

Любые идеи? Проблема в том, что когда я вставляю пустую строку или DateTime в базу данных, она записывает минимально возможную дату, например 1/1/1900.

РЕДАКТИРОВАТЬ: «Невозможно вывести общий тип, предполагаемый объект». Это ошибка, которую я сейчас получаю.


person BearSkyview    schedule 13.12.2012    source источник
comment
Что произойдет, если вы просто передадите Nothing?   -  person RBarryYoung    schedule 13.12.2012
comment
Если я передаю «Ничего», он также устанавливает минимальную дату.   -  person BearSkyview    schedule 13.12.2012
comment
Я предлагаю вам поместить Option Strict On в качестве первой строки файла с этим кодом. Затем, когда вы исправите проблемы, которые он выделяет, ваш код может быть в рабочем состоянии :)   -  person Andrew Morton    schedule 13.12.2012


Ответы (2)


Это потому, что strErrorDate2.Date - это DateTime, а System.DbNull.Value - это объект. Либо Direct Cast strErrorDate2 для объекта в IF (), либо сделайте что-то вроде этого

Dim oErrorDate2 as Object = System.DbNull.Value

If strErrorDate2 <> Nothing Then oErrorDate = strErrorDate2

.Add(New SqlParameter("@ErrorDate2",oErrorDate2))
person Ciarán    schedule 13.12.2012
comment
В итоге я использовал переменную, как указано выше, для DbNull.Value. У меня возникли проблемы с попыткой преобразовать мои входные строки в DateTime при вводе, поэтому я сделал if, чтобы проверить, ничего ли. Я конвертирую в DateTime, если там что-то есть, а если нет, то использую в качестве параметра переменную DbNull. - person BearSkyview; 14.12.2012

Это почти наверняка происходит из-за того, что находится на стороне вашего SQL Server. Очень вероятно, что либо вы вызываете хранимую процедуру, которая заменяет Null минимальной датой, либо (что более вероятно) таблица, в которую вы вставляете, имеет либо триггер, либо значение столбца по умолчанию, которое назначает минимальную дату когда он равен нулю.


Просто чтобы уточнить: во-первых, вам не нужно беспокоиться о превращении Nothing в DBNulls, ADO.net должен делать это за вас.

Во-вторых, если вы отправляете SQL Server Nothing / Null, и он хранит что-то еще, то это потому, что он (таблица или хранимая процедура) заменяет NULL значением по умолчанию. Скорее всего, это связано с тем, что структура данных не хочет, чтобы значения NULL находились в столбце, в который вы пытаетесь их вставить.

person RBarryYoung    schedule 13.12.2012
comment
Если передать DBNull.Value, он работает правильно. Я просто не могу понять логику правильного выбора между фактическим значением и DBNull. Вы все еще думаете, что это что-то на стороне SQL-сервера? - person BearSkyview; 13.12.2012
comment
Я запутался. В своем OP вы указываете, что получаете ошибку преобразования строки при переходе в DBNull.Value? - person RBarryYoung; 13.12.2012
comment
.Add (New SqlParameter (@ ErrorDate2, strErrorDate2)) .Add (New SqlParameter (@ ErrorDate2, DBNull.Value)) Первый работает, но устанавливает минимальную дату, если isNothing. Второй работает, чтобы вставить null независимо. - person BearSkyview; 13.12.2012
comment
А что произойдет, если вы сделаете: .Add(New SqlParameter("@ErrorDate2", Nothing))? - person RBarryYoung; 13.12.2012
comment
.Add (New SqlParameter (@ ErrorDate2, If (strErrorDate2 ‹› Nothing, strErrorDate2.Date, DBNull.Value))) - я пытаюсь сделать и то, и другое с этим. Здесь я получаю сообщение об ошибке. - person BearSkyview; 13.12.2012
comment
Ничто также не устанавливается на минимум, как это делает приравнивание переменной. - person BearSkyview; 13.12.2012
comment
Нет, попробуйте так, как я писал выше. Что тогда происходит? - person RBarryYoung; 13.12.2012
comment
Хорошо, тогда почти наверняка это то, что я сказал выше в своем ответе. - person RBarryYoung; 13.12.2012
comment
.Add (New SqlParameter (@ ErrorDate2, Nothing)) делает то же самое, что и .Add (New SqlParameter (@ ErrorDate2, strErrorDate2)), когда strErrorDate2 не имеет значения. - person BearSkyview; 13.12.2012