vb.net SQL日期到时间转换问题
错误是:从字符串转换日期和/或时间时,转换失败 基本上,我是在尝试这样做,当某人单击列表框中的某个位置时,它会将统计表中的正确字段增加1,表示他们单击了该位置。我想解决这个问题已经有一段时间了,但还是一事无成。我的日期是日期格式,我的统计表中的日期字段也是。我的代码可以在下面看到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
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)