Vb.net 如何将TimeSpan变量传递到数据库

Vb.net 如何将TimeSpan变量传递到数据库,vb.net,string,Vb.net,String,我有这样的代码: Dim starttime As TimeSpan = fromtimepicker.Value.TimeOfDay Dim endtime As TimeSpan = TotimePicker.Value.TimeOfDay 我试着像这样更新我的表: Dim sqlcmd As String = "update Location_tbl set StartTime='" & starttime & "' ,EndTime='" & endtime &

我有这样的代码:

Dim starttime As TimeSpan = fromtimepicker.Value.TimeOfDay
Dim endtime As TimeSpan = TotimePicker.Value.TimeOfDay
我试着像这样更新我的表:

Dim sqlcmd As String = "update Location_tbl set StartTime='" & starttime & "' ,EndTime='" & endtime & "'  
但是错误是这样发生的:

operator & is not defined for types 'string' and system.timespan
如何解决此问题使用

 starttime.ToString(...)

在哪里。。。是格式字符串()-它取决于您使用的数据库。有时需要使用数据库功能进行转换。

此错误与数据库无关。您正在尝试将
TimeSpan
变量与
字符串
变量组合。您必须告诉.NET如何使用
ToString
string.Format
将时间跨度表示为字符串

将SQL语句设置为字符串后,就可以执行该语句了

您可能想考虑使用参数,而不是将字符串连接到语句中。

首先,您应该使用-----这是一个很好的实践,因为它会使SQL语句更容易阅读,而不必将每个值转换成字符串。它还将有助于避免对您可能拥有的任何字符串输入的可能攻击

其次,如何找到解决方案取决于这些列在数据库中的数据类型。如果它们是DateTime或Time,则可以按原样使用该值

Dim sql As String = "update Location_tbl set StartTime= @starttime, EndTime= @endtime"

Using cn As New SqlConnection("Your connection string here"), _
    cmd As New SqlCommand(sql, cn)

    cmd.Parameters.Add("@starttime", SqlDbTypes.DateTime).Value = fromtimepicker.Value.TimeOfDay
    cmd.Parameters.Add("@endtime", SqlDbTypes.DateTime).Value = TotimePicker.Value.TimeOfDay
    Return cmd.ExecuteScalar()
End Using
如果它们是字符串类型,那么只需将数据类型更改为
SqlDbTypes.VarChar
之类的类型,并在末尾使用
.ToString
传递值即可


旁注;我认为您在sql语句末尾缺少了一个
WHERE
子句(除非此表中只有一行?

表中的
StartTime
列的数据类型是什么?此外,最好使用@huMptyduMpty,因为确切的数据类型与错误无关。除了OP关于&运算符的问题外,还有将TimeSpan客户端CLR对象映射到SQL Server(或其他数据库)中对应对象的实际问题,OP可能还不知道。在SQL Server实现TimeSpan数据类型之前,在选择SQL Server类型时,时间是推荐的乱码,有时在客户端进行整数转换。@huMptyduMpty如果使用的是其他数据库,则必须使用相应的参数类--,等等。@ZevSpitz:Yes数据类型与错误无关。但是,给出一个正确的答案(进行SQL注入)是有帮助的,SQL注入不是这里的问题。OP是从一个
TimeSpan
开始的,对于它,任何字符串格式都不会包含SQL语句(除非他使用
startTime.ToString(“{0};DROP DATABASE dbname;-->”)
。使用参数仍然有充分的理由:1)避免本地计算机和服务器之间的格式冲突——例如mm/dd和dd/mm,2)效率,因为服务器不必每次都重新计算执行计划。@ZevSpitz-同意,尽管这是一个很好的做法。我已经更新了我的答案