2011-03-27 107 views
0

错误是:从字符串转换日期和/或时间时转换失败。vb.net SQL日期时间转换问题

基本上我试图做到这一点,当有人点击列表框中的某个位置时,它会将统计信息表中的正确字段加1以表示他们单击了该位置。我一直在努力解决这个问题,现在不能得到任何东西。我的日期是日期格式,我的统计表中的日期字段也是如此。我的代码可以在下面看到。

Dim Current As String 
    Dim Check As String 
    Dim objCmd2 As Object 
    Dim iCount As Integer 
    Dim tDate As Date 

    Current = LocBox.SelectedItem 

    Check = LocList.FindString(Current) 

    If Check > -1 Then 
     MsgBox("You have already selected this place to visit") 
    Else 
     LocList.Items.Add(Current) 
     ObjDataReader.Close() 
     tDate = Date.Today 
     MessageBox.Show(tDate) 
     tDate = tDate.ToString() 
     objCmd2 = New SqlCommand("SELECT " & Replace(Current, " ", "_") & " FROM Stats WHERE Date = '" & tDate & "'", objConn) 
     ObjDataReader = objCmd2.ExecuteReader 
     If ObjDataReader.HasRows Then 
      ObjDataReader.Read() 
      If ObjDataReader(0) Is DBNull.Value Then 
       iCount = 0 
      Else 
       iCount = ObjDataReader(0) 
      End If 
     Else 
      iCount = 0 
     End If 
     objCmd = New SqlCommand("INSERT INTO Stats(Date," & Replace(Current, " ", "_") & ") Values('" & tDate.Date & "'," & iCount & ")", objConn) 
     ObjDataReader.Close() 
     objCmd.ExecuteNonQuery() 
     objConn.Close() 

在此先感谢。

问题出现在我认为的第二条SQL语句中。我不明白为什么将日期添加到日期字段会是一个问题,我试着将它添加为一个不起作用的字符串。感谢所有迄今为止的答案。

+1

使用参数化查询与正确的数据类型的参数。这是更安全的(SQL注入),并应解决您的问题。 – 2011-03-27 14:11:11

+0

Sql Server中的datetime列的格式是什么?它实际上是一个日期时间吗?还是像varchar那样?处理日期和时间时,不应该使用字符串。使用日期时间。 – 2011-03-28 15:53:58

回答

0

我要去猜测的问题是在这里:MessageBox.Show(tDate)

你需要使用tDate.ToString或任何其他方法,你要的日期转换为字符串。

你是否收到编译错误?我总是使用Option Strict On进行编码,并且在不转换变量的情况下,您的代码肯定会引发错误。

0

我可能不在基地,但你有tDate作为日期变量类型,然后你试图发送一个字符串,你可以在你的SqlCommand行中使用tDate.ToString(),而不是先转换它。

1

正如马丁指出,这可能是最好的选择:

int colnum = ConvertColumnNameToNumber(Current) 
objCmd2 = New SqlCommand("SELECT "+colnum.ToString()+" FROM Stats WHERE [Date] = @inDate", objConn) 
objCmd2.Parameters.Add("@inDate",SqlDbType.DateTime).value = tDate 

未经测试或编译可能有错别字。

请注意使用上面的colnum。因为不能使用列名称的参数,所以必须使用列号。如果你的代码返回一个整数作为返回值,你可以防止注入(它只能是一个数字)。

+0

为什么会有帮助?如果OP得到'从字符串转换日期和/或时间时转换失败'的信息,添加一个明确的转换仍然会给它们相同的错误。该字符串显然不适用于SQL Server的可接受格式。 – 2011-03-27 14:28:37

+0

我相信cast失败时会返回null - 所以它不会抛出错误。 – Hogan 2011-03-27 14:29:57

+0

@Hogan - 那么你完全错误地认为 - 即使它确实(它没有)不会更正确的做法是修复字符串格式,以便SQL Server能够理解它? (尽管这里唯一真正正确的答案是使用参数) – 2011-03-27 14:30:40

0

尝试删除从各地tdate撇号,以便它是...

objCmd2 = New SqlCommand("SELECT " & Replace(Current, " ", "_") & " FROM Stats WHERE Date = " & tDate, objConn) 

objCmd = New SqlCommand("INSERT INTO Stats(Date," & Replace(Current, " ", "_") & ") Values(" & tDate.Date & "," & iCount & ")", objConn)