Вставка значений null в поля даты?
у меня есть FormView, где я вытаскиваю данные из одной таблицы (MS Access), а затем вставляю его (плюс больше данных) в другую таблицу. У меня проблемы с датами.
первая таблица имеет два поля даты: date_submitted
и date_updated
. В некоторых записях, date_updated
- это пустое. Это заставляет меня получить ошибку несоответствия данных при попытке вставить во вторую таблицу.
это может быть потому, что я databinding date_updated
поле из первой таблицы в HiddenField на Этот. Затем он берет значение из HiddenField и пытается вставить его во вторую таблицу:
Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated")
myDateRequestUpdated = hfDateRequestUpdated.Value
'... It then attempts to insert myDateRequestUpdated into the database.
он работает, когда там есть значение, но, по-видимому, вы не можете ничего вставить в поле даты/времени в Access. Полагаю, я мог бы сделать второй оператор insert, который не вставляет в date_updated
(использовать, когда нет значения вdate_updated
), но это единственный способ сделать это? Кажется, что должно быть проще / менее избыточным путь.
редактировать:
ОК. Поэтому я попытался вставить SqlDateTime.Нуль, ничего, и значение dbnull.Значение. Sqldatetime с.Null приводит к вставке значения 1/1/1900 в базу данных. "Ничто" заставляет его включить 1/1/2001. И если я попытаюсь использовать DBNull.Value, он говорит мне, что его нельзя преобразовать в строку, поэтому, возможно, я не сделал что-то прямо там. Во всяком случае, я надеялся, что если нечего будет вставить, то поле в Access останется пустой, но кажется, что он должен чем-то заполнить его...
редактировать:
я получил DBNull.Значение для работы, и оно вставляет полностью пустое значение. Итак, это мой последний рабочий код:
Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated")
Dim myDateRequestUpdated = Nothing
If hfDateRequestUpdated.Value = Nothing Then
myDateRequestUpdated = DBNull.Value
Else
myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value)
End If
спасибо всем!
3 ответов
Сара, вы пробовали кастинг дату / время, прежде чем обновлять его? Ошибка несоответствия данных, вероятно, происходит из-за того, что hfDateRequestUpdated.Value
вы пытаетесь вставить в базу данных не совпадает с типом столбца.
попробуйте пройти через свой код и посмотреть, какой тип этого значения. Если вы обнаружите, что это строка (которая, похоже, может быть, так как она исходит из поля в форме), вам сначала нужно будет проверить, является ли это поле пустой строкой (VBNullString
). Если это так, вы хотите изменить значение, которое вы вставляете в базу данных DBNull
, который вы можете получить в VB.Net использование DBNull.Value
.
мы не можем видеть ваш код, так что мы не знаем точно, как вы получаете значение в базу данных, но это будет выглядеть примерно так
If theDateValueBeingInserted is Nothing Then
theDateValueBeingInserted = DBNull.Value
EndIf
имейте в виду, что вышеупомянутый тест работает только в том случае, если значение, которое вы получаете от HiddenField, является строкой, которая, я считаю, соответствует документация. Вот, наверное, где все это у тебя откуда. Вы неявно преобразуете свои значения даты/времени в строку (что легко), но неявное преобразование их обратно не так просто, особенно если начальное значение было DBNull
в сторону
Я думаю, что Маршалл пытался предложить эквивалент вышеуказанного кода, но в коротком выражении, называемом "тернарным оператором", который выглядит так: VB.Net:
newValue = IF(oldValue is Nothing ? DBNull.Value : oldValue)
I не рекомендовал бы это, хотя, поскольку это запутывает новых программистов, и синтаксис изменился в 2008 году с IFF(condition ? trueResult : falseResult)
код
Dim myDateRequestUpdated As DateTime
myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value) : DBNull.Value()
есть несколько проблем:
- при объявлении
myDateRequestUpdated
наDateTime
, вы не можете поставить DbNull.Ценность в этом. - я не уверен, что вам нужно
()
для DbNull.Значение: это свойство, а не метод (я не знаю достаточно VB, чтобы сказать точно) - VB не знает, что
:
оператор
что вы, вероятно, хотите-это Nullable(Of DateTime)
для хранения значения DateTime, которое также может быть недостающий.
затем использовать что-то вроде этого, чтобы сохранить значение:
myDateRequestUpdated = If(String.IsNullOrWhiteSpace(hfDateRequestUpdated.Value),
Nothing, DateTime.Parse(hfDateRequestUpdated.Value))
если hfDateRequestUpdated.Value
пусто, то используйте Nothing
в результате; иначе проанализируйте значение как дату (которая может завершиться ошибкой, если это не действительная дата!).
попробуйте это:
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim str As String
If TextBox1.Text.Length <> 0 Then
str = "'" & TextBox1.Text & "'"
Else
str = "NULL"
End If
sql = "insert into test(test1) values(" & str & ")"
dsave_sql(sql)
End Sub
Function save_sql(ByVal strsql As String, Optional ByVal msg As String = "Record Saved Sucessfully") As String
Dim sqlcon As New SqlConnection(strConn)
Dim comm As New SqlCommand(strsql, sqlcon)
Dim i As Integer
Try
sqlcon.Open()
i = CType(comm.ExecuteScalar(), Integer)
save_sql = msg
Catch ex As Exception
save_sql = ex.Message
End Try
sqlcon.Close()
Return i
End Function