2015-07-12 42 views
1

我有我的代码问题,我花了一天,但无法找出解决方法。错误代码是指定投的无效检查日期值为空 - 指定投射无效

这是非常高的机会是由于我的数据类型值检查日期值是否为空。因为当我删除I​​F ELSE语句的代码工作正常,我可以更新数据库。

情景是我为访问者提供时钟和停止时间,所以首先访问者时钟然后信息将插入到DB没有时钟输出时间(显然DB中的时钟输出时间将为NULL),后来当访问者计时出来时,我需要验证同一个访问者的计时时间是否为NULL。

下面是我的代码:

Private Sub btn_clockout_Click(sender As Object, e As EventArgs) Handles btn_clockout.Click 
    Dim con As New SqlConnection 
    Dim cmd As New SqlCommand 
    Dim clockouttimestatus As DateTime? = Nothing 

    Try 
     con.ConnectionString = "Data Source=LAPTOP-HP;Initial Catalog=COMPANY;Integrated Security=True" 
     cmd.Connection = con 
     con.Open() 
     cmd.CommandText = "select v_clockouttime from visitor where v_id = @txt_visitorid" 
     cmd.Parameters.Add("@txt_visitorid", SqlDbType.Int).Value = txt_visitorid.Text 
     clockouttimestatus = cmd.ExecuteScalar() 

     If IsDBNull(clockouttimestatus) Then 

      cmd.CommandText = "update visitor set v_clockouttime = @lbl_displaydate where v_id = @txt_visitorid" 

      cmd.Parameters.Add("@lbl_displaydate", SqlDbType.DateTime).Value = lbl_displaydate.Text 
      cmd.Parameters.Add("@txt_visitorid", SqlDbType.Int).Value = txt_visitorid.Text 
      cmd.ExecuteNonQuery() 

      MessageBox.Show("Visitor ID is successful clockout") 
     Else 

      MessageBox.Show("Visitor ID is failed to clockout") 

     End If 

    Catch ex As Exception 
     MessageBox.Show("Error while updating record on table..." & ex.Message, "Update Records") 
    Finally 
     con.Close() 
    End Try 
+0

前检查DbNull “你的意思是你删除了如果其他但不是更新? –

+0

删除'Try Catch'块,您将获得有关抛出异常的所有必需信息。至少你会得到一个行号。因为在你的代码中有三行代码可以抛出'指定的无效'。 – Fabio

+0

@Fabio,我删除了Try Catch块之后,突出显示的代码是三条线的“clockouttimestatus”。 (1)Dim clockouttimestatus As DateTime? = Nothing(2)clockouttimestatus = cmd.ExecuteScalar(),(3)如果IsDBNull(clockouttimestatus)然后 –

回答

0

我认为当你试图ExecuteScalar()方法的Nullable(Of DateTime)可变的分配结果specified cast in not valid错误将被抛出。

Dim clockouttimestatus As DateTime? = Nothing 
clockouttimestatus = cmd.ExecuteScalar() 

这个异常会被抛出,只有当返回的值是DbNull

添加当我删除了的if else语句的代码工作正常通过”分配一个值

'connection and command staff 
Dim databaseValue = cmd.ExecuteScalar() 
clockouttimestatus = If(IsDbNull(databaseValue) = True, Nothing, databaseValue) 

If clockouttimestatus.HasValue = False Then 
    'Use your update block 
End If 
+0

刚刚尝试了您的建议,但失败了。代码中的错误返回。 –

+0

@GaryYee,你可以删除'尝试Catch'块并发布异常消息和StackTrace问题。堆栈跟踪通常会提供足够的错误信息 – Fabio

2
cmd.Parameters.Add("@lbl_displaydate", SqlDbType.DateTime).Value = lbl_displaydate.Text 

您分配一个文本值的日期时间参数。如果.NET无法将其隐式转换为日期时间,则该语句将失败。你应该照顾投在你的代码,例如这样的:

Dim parsedDate as DateTime 
Dim isValidDate as boolean = DateTime.TryParse(lbl_displaydate.Text, parsedDate) 

If isValidDate Then 
    cmd.Parameters.Add("@lbl_displaydate", SqlDbType.DateTime).Value = parsedDate 
End If 
+1

@Gary Yee,请务必在此解决您的问题时通过单击对勾感谢Saragis,并从未回答列表中删除此问题 – Plutonix

+0

@Saragis,感谢您的帮助。但我会说lbl.displaydate.text实际上是显示当前系统的日期时间,这是正确的,而不是一个字符串。这条线确认没有问题,因为如果我删除我的clockouttimestatus验证我的更新查询工作正常。 –