7

I am looking for the best practice, real solution, to send a Null to a SQL Server 2008 R2 database table, when a date is unknown.

I read some inputs from a formview, and a date field maybe unknown. The database allows Null values in the field but the VB to store the Null prior to a parameterized query update is not working/eludes me.

    Dim tb2 As TextBox = TryCast(FormView1.FindControl("tbPurchDate"), TextBox)
    Dim purDT As Date
    If tb2.Text = "" Then
        IsDBNull(purDT)    ' Tried this along with other possible code
    Else
        purDT = Convert.ToDateTime(tb2.Text)
    End If

Any help would be greatly appreciated.

Cristian Lupascu
  • 39,078
  • 16
  • 100
  • 137
htm11h
  • 1,739
  • 8
  • 47
  • 104

4 Answers4

12

If the date is unknown, send DbNull.Value as the parameter's value:

If dateIsUnknown Then
    cmd.Parameters.Add(New SqlParameter _
                       With {.ParameterName = "@purDT", _
                             .SqlDbType = SqlDbType.Date, _
                             .Value = DBNull.Value})
Else
    cmd.Parameters.Add(New SqlParameter _
                       With {.ParameterName = "@purDT", _
                             .SqlDbType = SqlDbType.Date, _
                             .Value = theDateVariable})
End If
Andrew Morton
  • 24,203
  • 9
  • 60
  • 84
  • Mortan, Works, clean, formatting is outside my convention but I can live with that, and it works great. Thank you very much!!! – htm11h Mar 13 '13 at 14:59
  • @marc11h You're welcome :) I wouldn't normally format it like that either, but it did fit into the available width. – Andrew Morton Mar 13 '13 at 15:27
1

You could use the Nullable(Of Date) to allow your purDT variable to also be Nothing:

Dim purDT As Nullable(Of Date) = Nothing

If tb2.Text <> "" Then
    purDT = Convert.ToDateTime(tb2.Text)
End If

However, the magic happens when you define the SQL parameter that will hold this value. The parameter should either be DBNull.Value or a valid (non-null) Date:

' initialize connection, command...

Dim param = New SqlParameter()
param.ParameterName = "NullableDate"
param.Value = IIf(purDT Is Nothing, DBNull.Value, purDT)

cmd.Parameters.Add(param)
cmd.ExecuteNonQuery()
Cristian Lupascu
  • 39,078
  • 16
  • 100
  • 137
1

It depends on the data method you are using to send the data to the server.

purDate is a variable of DateTime type and it cannot be set to null.

I suggest you use IsDate instead of testing length.

    Dim purDT As Date
    If Not IsDate(TextBox1.Text) Then
        purDT = Nothing
    Else
        purDT = Convert.ToDateTime(TextBox1.Text)
    End If
rheitzman
  • 2,247
  • 3
  • 20
  • 36
-1

Try this :

Dim purDT As Nullable(Of Date)

If tb2.Text = "" Then
    purDT = DBNull.Value
Else
    purDT = Convert.ToDateTime(tb2.Text)
End If
SolarBear
  • 4,534
  • 4
  • 37
  • 53