【问题标题】:Error when trying to update values in database尝试更新数据库中的值时出错
【发布时间】:2013-04-05 00:40:14
【问题描述】:

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

【问题讨论】:

  • 当 SQL DBMS 抛出错误时,'near' 建议怎么办?您应该检查您的列(在 UPDATE 查询中)数据类型,其中“文本”(varchar,char,...)应该包含在一对单引号中,我认为您应该将此规则应用于所有列。最后是关于图像栏的?是存储图像路径的二进制/图像还是简单的文本类型?
  • 最后一个值 us 字符串。错误出现在“TrackDuration”中,即时间,我不知道为什么......
  • 请参数化您的查询。
  • 嘿,如果是这样,我确定您将不正确的日期时间值格式传递到 TrackDuration 列的 UPDATE 查询中,请提供一些您为查询设置/准备的值的示例。
  • 如果您显示InsertQuery 的格式化值而不是格式化行,那将是显而易见的。

标签: c# database sql-update insert-update


【解决方案1】:

'02:30:00' 不是 datetime DB 字段 AFAIK 的正确值。默认格式由date format setting 控制。

此外,“20130412”在任何情况下都应该有效,但对于日期时间字段。您需要正确格式化TrackDuration 或使用CAST/CONVERT。由于TimeSpan 不包含日期部分(它代表一个持续时间而不是一个时间点),您只能弥补它(例如,在前面加上“20100101”),但这是一个糟糕的 hack。

正确的解决方案是使用正确的数据库字段类型。

如果字段是time 类型,'02:30:00' 可能会起作用。请阅读更多关于time types in SQL Server 的信息。

更好的是,为什么不使用纯整数来表示持续时间(以秒为单位)?无论如何,持续时间不是日期。

更大的问题是您正在连接字符串来设置命令文本,这为 SQL 注入攻击打开了大门。如果我将赛道命名为a';DROP TABLE tblTracks;--,您的数据库就是吐司:

UPDATE tblTracks SET TrackLength=35, 
                     TrackDuration='02:30:00', 
                     TrackName='a';DROP TABLE tblTracks;-- ...

【讨论】:

  • 您好,谢谢!持续时间是小时/分钟。如果持续时间是字符串,它有效吗?
  • 不,因为您的字段是DATE时间,但您没有日期,只有持续时间。请按照我的答案中的链接进行操作。
  • @Nave Tseva 您的表结构设计得不好,正如您所说 IsCircular 和 ForBeginners 是字符串类型,但应该重新设计为位类型。 Zdeslav 所说的持续时间应该是以秒为单位计算的数字,如果您想在 C# 代码中使用 Timespan,则应该是时间(不是日期时间)。
  • @KingKing 谢谢,但我认为这就是我所做的:“ TimeSpan TrackDuration =TimeSpan.Parse(Request.Form["TrackDuration"].ToString());
  • 是的,您想使用 Timespan,因此重新设计您的 TrackDuration 列类型并将其更改为时间(日期时间不起作用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2017-11-01
  • 1970-01-01
  • 2021-07-01
  • 2020-09-05
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多