尝试更新数据库中的值时出错

本文关键字:出错 更新 数据库 | 更新日期: 2023-09-27 18:08:55

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