7

我有一个 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 被插入到数据库中。“Nothing”会导致它插入 2001 年 1 月 1 日。如果我尝试使用 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

感谢大家!

4

3 回答 3

3

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

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

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

If theDateValueBeingInserted is Nothing Then
    theDateValueBeingInserted = DBNull.Value
EndIf

请记住,仅当您从 HiddenField 获得的值是字符串时,上述测试才有效,我相信它是根据文档。这可能就是您遇到的所有这些麻烦的来源。您正在将您的日期/时间值隐式转换为字符串(这很容易),但将它们隐式转换回来并不是那么容易,特别是如果初始值是DBNull


在旁边

我认为 Marshall 试图建议的是上面代码的等价物,但是在一个称为“三元运算符”的快捷表达式中,它在 VB.Net 中看起来像这样:

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

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

于 2012-05-03T15:24:24.570 回答
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
于 2013-12-05T10:15:22.587 回答
2

你的代码

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

有几个问题:

  1. 当您声明myDateRequestUpdated为时DateTime,您不能将 DbNull.Value 放入其中。
  2. 我不确定您是否需要()for DbNull.Value:它是一种属性,而不是一种方法(我对 VB 的了解还不够多,无法确定)
  3. VB不知道那个:运算符

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

然后使用这样的东西来存储值:

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

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

于 2012-05-03T15:26:10.643 回答