我有一个FormView,我从一个表(MS Access)中提取数据,然后将其(加上更多数据)插入到另一个表中。我对日期有疑问。
第一个表格有两个日期字段:date_submitted
和date_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
谢谢大家!
答案 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()
有几个问题:
myDateRequestUpdated
声明为DateTime
时,您无法在其中加入DbNull.Value。()
:它是一个属性,而不是一个方法(我不知道足够的VB可以肯定地说):
运算符您可能想要的是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