vb.net SQL日期到时间转换问题

vb.net SQL日期到时间转换问题,sql,sql-server,vb.net,date,Sql,Sql Server,Vb.net,Date,错误是:从字符串转换日期和/或时间时,转换失败 基本上,我是在尝试这样做,当某人单击列表框中的某个位置时,它会将统计表中的正确字段增加1,表示他们单击了该位置。我想解决这个问题已经有一段时间了,但还是一事无成。我的日期是日期格式,我的统计表中的日期字段也是。我的代码可以在下面看到 Dim Current As String Dim Check As String Dim objCmd2 As Object Dim iCount As Integer Dim

错误是:从字符串转换日期和/或时间时,转换失败

基本上,我是在尝试这样做,当某人单击列表框中的某个位置时,它会将统计表中的正确字段增加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语句带来了这个问题。我不明白为什么将日期添加到日期字段会是一个问题,我尝试将其作为字符串添加,但没有成功。谢谢你迄今为止的所有答案。

我猜问题就在这里:MessageBox.Show(tDate)

您需要使用tDate.ToString或任何其他方法将日期转换为字符串


你有编译错误吗?我总是使用Option Strict On编写代码,如果您不转换变量,您的代码肯定会出现错误。

我可能不正确,但您将tDate作为日期变量类型,然后尝试向其发送字符串,您可以使用tDate.ToString()在您的SqlCommand行中,不要首先转换它。

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

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。因为不能对列名使用参数,所以必须使用列号。如果您的代码返回一个整数作为返回值,您可以防止注入(它只能是一个数字)。

请尝试删除tdate周围的撇号,以便

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


使用具有正确数据类型的参数的参数化查询。这更安全(SQL注入),应该可以解决您的问题。SQL Server中的datetime列的格式是什么?这真的是约会时间吗?还是像瓦查尔?处理日期和时间时不应使用字符串。使用日期时间。为什么会有帮助?如果OP在从字符串转换日期和/或时间时收到消息
转换失败。
添加显式强制转换仍然会给他们带来相同的错误。该字符串显然不是SQL Server可接受的格式。我相信cast失败时返回null,因此不会抛出错误。@Hogan-您当时完全不正确地认为-即使它这样做了(事实并非如此),更正确的做法不是修复字符串格式,以便SQL Server理解它吗?(虽然这里唯一正确的答案是使用参数)@Martin--很好--那么请告诉我一个SQL语句,它可以处理非法的日期格式并且不会失败。@Coolmurr,@Martin--我更改了它以显示“not”参数化列名的安全方法。您不能使用从broswer返回的字符串,但是如果您有一个只返回和整数的helper函数,那么您是安全的。
objCmd = New SqlCommand("INSERT INTO Stats(Date," & Replace(Current, " ", "_") & ") Values(" & tDate.Date & "," & iCount & " )", objConn)