我有以下c#/Query:
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
'02:30:00'不是datetime DB字段的正确值。默认格式由日期格式设置控制。
此外,'20130412'在任何情况下都应该工作,但对于datetime字段。请正确格式化TrackDuration
或使用CAST/CONVERT
。由于TimeSpan
不包含日期部分(它表示持续时间而不是时间点),您只能将其弥补(例如前置"20100101"),但这是一个可怕的黑客。
正确的解决方案是使用正确的DB字段类型。
如果字段是time
类型,'02:30:00'可能工作。请阅读更多关于SQL Server中的时间类型。
更好的是,为什么不使用纯整数表示以秒为单位的持续时间呢?无论如何,持续时间不是日期。
更大的问题是,您正在连接字符串来设置命令文本,这会打开SQL注入攻击。如果我将赛道命名为a';DROP TABLE tblTracks;--
,那么您的数据库就完蛋了:
UPDATE tblTracks SET TrackLength=35,
TrackDuration='02:30:00',
TrackName='a';DROP TABLE tblTracks;-- ...