将空值插入日期字段?

问题描述:

我有一个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. 

它的工作原理时,有一个价值存在,但显然你不能没有插入日期/时间域访问。我想我可以做第二个插入语句,不插入date_updated(在date_updated中没有值时使用),但这是唯一的方法吗?似乎应该有一个更容易/更少冗余的方式。

编辑

好。所以我试过插入SqlDateTime.Null,Nothing和DBNull.Value。 SqlDateTime.Null导致将值1/1/1900插入到数据库中。 “Nothing”导致它插入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

我不明白为什么有在这个问题上downvote。我扭转了它,但我仍然感到困惑。 – Fionnuala 2012-04-20 07:55:00

+0

我同意,这是一个有趣的问题。这些日期字段总是咬我。 – Steve 2012-04-20 08:13:46

+0

你可以添加一个代码示例显示你如何插入数据? – phoog 2012-04-20 15:45:25

萨拉,你有没有尝试在你更新之前投射日期/时间?数据不匹配错误可能来自您试图插入数据库的hfDateRequestUpdated.Value与列类型不匹配。

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

我们不能看到你的代码,所以我们不知道你究竟是如何得到的值到数据库中,但它会是这个样子

If theDateValueBeingInserted is Nothing Then 
    theDateValueBeingInserted = DBNull.Value 
EndIf 

记住上面的测试只如果你从HiddenField得到的值是一个字符串,我相信它是根据documentation。这可能是你遇到的所有这些麻烦都来自哪里。你含蓄地转换您的日期/时间值的字符串(很简单),但含蓄地将它们背也不是那么容易的,特别是如果初始值是一个DBNull


一边

我想马歇尔试图建议是上面的代码相当,但在被称为“三元运算符”快捷方式表达,它看起来像这样在VB.Net:

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

我WOU ldn't推荐它,虽然,因为它是混乱的新的程序员,语法从IFF(condition ? trueResult : falseResult)

您的代码

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

在2008年改变有几个问题:

  1. 当你声明myDateRequestUpdatedDateTime,则不能在其中放置DbNull.Value。
  2. 我不知道你需要的()为DbNull.Value:这是一个属性,而不是方法(我不知道够不够VB肯定地说)
  3. VB不知道:操作

你可能想要的是一个Nullable(Of DateTime)来存储一个DateTime值也可以丢失。

然后使用这样的存储值:

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

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

+0

她只是首先尝试了该代码,因为她试图按照之前用C#编写的答案中的指示。我不认为她在原始代码中有任何与之相近的东西。无论如何,您对该编辑代码的更正是正确的。 – Alain 2012-05-03 15:33:17

试试这个:

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