将空值插入日期字段?

时间:2012-04-20 04:43:00

标签: asp.net sql vb.net ms-access

我有一个FormView,我从一个表(MS Access)中提取数据,然后将其(加上更多数据)插入到另一个表中。我对日期有疑问。

第一个表格有两个日期字段:date_submitteddate_updated。在某些记录中,date_updated为空。这会导致我在尝试插入第二个表时出现数据不匹配错误。

这可能是因为我将第一个表中的date_updated字段数据绑定到FormView上的HiddenField中。然后它从HiddenField获取值并尝试将其插入第二个表:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated")
myDateRequestUpdated = hfDateRequestUpdated.Value
'... It then attempts to insert myDateRequestUpdated into the database.

当有值时,它可以工作,但显然你不能在Access中的日期/时间字段中插入任​​何内容。我想我可以制作一个不插入date_updated的第二个插入语句(在date_updated中没有值时使用),但这是唯一的方法吗?似乎应该有一个更简单/更少冗余的方式。

编辑

好。所以我尝试插入SqlDateTime.Null,Nothing和DBNull.Value。 SqlDateTime.Null导致将值1/1/1900插入数据库。 “没什么”导致它插入1/1/2001。如果我尝试使用DBNull.Value,它告诉我它不能转换为字符串,所以也许我没有在那里做一些事情。无论如何,我希望如果没有任何内容可以插入,那么Access中的字段将保持空白,但似乎它必须填充一些内容......

编辑

我有DBNull.Value工作,它确实插入一个完全空白的值。所以这是我最后的工作代码:

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 个答案:

答案 0 :(得分:3)

Sara,您是否尝试过更新前的日期/时间?数据不匹配错误可能是因为您尝试插入数据库的hfDateRequestUpdated.Value与列类型不匹配。

尝试单步执行代码并查看该值的类型。如果你发现它是一个字符串(似乎它可能是,因为它来自表单上的字段),那么你需要先检查一下,看看该字段是否为空字符串(VBNullString)。如果是这样,您将需要将要插入数据库的值更改为DBNull,您可以使用DBNull.Value在VB.Net中获取该值。

我们无法看到您的代码,因此我们不确切知道您如何将值传入数据库,但它看起来像这样

If theDateValueBeingInserted is Nothing Then
    theDateValueBeingInserted = DBNull.Value
EndIf

请记住,只有从HiddenField获得的值是一个字符串时,上述测试才有效,我相信它是根据documentation。这可能就是你所遇到的所有麻烦来自哪里。您隐式将日期/时间值转换为字符串(这很容易),但隐式转换它们并不容易,特别是如果初始值为DBNull


预留

我认为Marshall试图建议的是相当于上面的代码,但是在一个名为'ternary operator'的快捷表达式中,在VB.Net中看起来像这样:

newValue = IF(oldValue is Nothing ? DBNull.Value : oldValue)

我不推荐它,因为它让新程序员感到困惑,而且语法在2008年从IFF(condition ? trueResult : falseResult)改变了

答案 1 :(得分:2)

您的代码

Dim myDateRequestUpdated As DateTime
myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value) : DBNull.Value()

有几个问题:

  1. 当您将myDateRequestUpdated声明为DateTime时,您无法在其中加入DbNull.Value。
  2. 我不确定你需要DbNull.Value的():它是一个属性,而不是一个方法(我不知道足够的VB可以肯定地说)
  3. VB不知道:运算符
  4. 您可能想要的是Nullable(Of DateTime)来存储也可能丢失的DateTime值。

    然后使用类似的东西存储值:

    myDateRequestUpdated = If(String.IsNullOrWhiteSpace(hfDateRequestUpdated.Value),
       Nothing, DateTime.Parse(hfDateRequestUpdated.Value))
    

    如果hfDateRequestUpdated.Value为空,则使用Nothing作为结果;否则将值解析为日期(如果它不是有效日期,则可能会失败!)。

答案 2 :(得分:2)

试试这个:

  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