Вставка значений 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()

есть несколько проблем:

  1. при объявлении myDateRequestUpdated на DateTime, вы не можете поставить DbNull.Ценность в этом.
  2. я не уверен, что вам нужно () для DbNull.Значение: это свойство, а не метод (я не знаю достаточно VB, чтобы сказать точно)
  3. 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