我有以下c#/查询:
TrackDuration =TimeSpan.Parse( Request.Form["TrackDuration"].ToString());
string InsertQuery = string.Format("UPDATE tblTracks SET TrackLength={0}, TrackDuration='{1}', TrackName='{2}',TrackDescription='{3}',TrackMap='{4}',DifficultLevel={5},OverallHeight={6},IsCircular='{7}', ForBeginners='{8}',StartPoint='{9}',ParkingPlace='{10}',SeasonOfYear={11},TrackLocation={12}, Images='{13}' WHERE UserID={14}",
TrackLength, TrackDuration, TrackName, TrackDescription, TrackMap, DifficultID, OverallHeight, IsCircular, ForBeginners, StartPoint, ParkingPlace, SeasonID, AreaID, ImageList, UserID);
但我收到此错误消息:
UPDATE语句中的语法错误
查询表达式中的语法错误(缺少运算符)
我真的试图解决这个问题,但我不能。
如何解决此问题?
更新:
这是查询的值:
UPDATE tblTracks SET TrackLength=35, TrackDuration='02:30:00', TrackName='45',TrackDescription='<p>sometext.</p>
',TrackMap='f',DifficultLevel=3,OverallHeight=450,IsCircular='true', ForBeginners='false',StartPoint='<p>קיבוץיסעור </p>
',ParkingPlace='<p>כניסה לקיבוץ יסעור</p>
',SeasonOfYear=1,TrackLocation=3, Images='' WHERE UserID=1
sql值类型是:
TrackLength = number ; TrackDuration = date/time ; TrackName= string ;TrackDescription= string; TrackMap = string; DifficultLevel=number;OverallHeight=number;IsCircular=true/false;ForBeginners=true/false;
StartPoint=string; ParkingPlace=string; SeasonOfYear=number; TrackLocation=number;Images=string
答案 0 :(得分:2)
&#39; 02:30:00&#39;对于 datetime 数据库字段AFAIK而言,它不是正确的值。默认格式由date format setting控制。
此外,&#39; 20130412&#39;应该适用于任何情况,但适用于datetime字段。您需要正确格式化TrackDuration
或使用CAST/CONVERT
。由于TimeSpan
不包含日期部分(它表示持续时间而非时间点),因此您只能弥补(例如前置&#34; 20100101&#34;)但这很糟糕破解。
正确的解决方案是使用正确的DB字段类型。
&#39; 02:30:00&#39;如果字段为time
类型,则可能有效。请阅读有关time types in SQL Server的更多信息。
更好的是,为什么不在几秒钟内使用普通整数?持续时间不是日期。
更大的问题是你连接字符串来设置命令文本,这会打开你的SQL注入攻击。如果我将赛道命名为a';DROP TABLE tblTracks;--
,那么您的数据库就是吐司:
UPDATE tblTracks SET TrackLength=35,
TrackDuration='02:30:00',
TrackName='a';DROP TABLE tblTracks;-- ...