0

我有以下 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
4

1 回答 1

2

'02:30:00' 不是日期时间数据库字段 AFAIK 的正确值。默认格式由日期格式设置控制。

此外,“20130412”在任何情况下都应该有效,但对于日期时间字段。您需要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;-- ...
于 2013-04-12T13:32:30.490 回答