使用 ## [Macromedia][SQLServer JDBC 驱动程序][SQLServer]更新错误关键字“WHERE”附近的语法不正确

Posted

技术标签:

【中文标题】使用 ## [Macromedia][SQLServer JDBC 驱动程序][SQLServer]更新错误关键字“WHERE”附近的语法不正确【英文标题】:Update error using ## [Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near the keyword 'WHERE' 【发布时间】:2015-12-28 15:15:18 【问题描述】:

这是我的代码:

    <cfdump var="#addEnt#" >

    <!-- ADD -->
    <cfquery name="add" datasource="testdatasource" dbtype="OLEDB">
        UPDATE tblrequests
        SET
        lastname='#ucase(form.lastname)#', 
        firstname='#ucase(form.firstname)#', 
        middlei='#ucase(form.middlei)#',
        title='#form.title#', 
        eod='#dateformat(form.eod,'m-d-yyyy')#',
        dutystation='#form.dutystation#', 
        requestsnetwork=<cfif parameterexists(form.requestsnetwork)>1<cfelse>0</cfif>, 
        affiliation='#form.affiliation#',
        commentssupvreq='#form.commentssupvreq#', 
        requestdelete=<cfif form.requestdelete IS NOT ''>'#dateformat(form.requestdelete,'m-d-yyyy')#',<cfelse>Null,</cfif>
        commentssupvdelete='#form.commentssupvdelete#',
        commentssupvedit='#form.commentssupvedit#',
        dateemailrequested=<cfif form.dateemailrequested IS NOT ''>'#dateformat(form.dateemailrequested,'m-d-yyyy')#',<cfelse>Null,</cfif>
        commentsit='#form.commentsit#',
        bgcomplete=<cfif form.bgcomplete IS NOT ''>'#dateformat(form.bgcomplete,'m-d-yyyy')#',<cfelse>Null,</cfif>
        dategroupscreated=<cfif form.dategroupscreated IS NOT ''>'#dateformat(form.dategroupscreated,'m-d-yyyy')#',<cfelse>Null,</cfif>
        WHERE recnumber = #addEnt#      
    </cfquery>

当我提交表单时出现错误:

执行数据库查询时出错。 [宏媒体][SQLServer JDBC 驱动程序][SQLServer]关键字“WHERE”附近的语法不正确。

我的 cfdump 从 sql 中显示正确的 addent 数字,但在 sql 语句中使用 #addEnt# 不起作用。我的应用程序中的其他页面## 用于 SQL 查询,它们工作正常。

【问题讨论】:

您的最后一个 SET 语句有一个逗号。此外,您应该真正考虑使用cfqueryparam 来降低 SQL 注入的风险。现在您的查询很容易受到 SQL 注入攻击。 啊!必须删除两个逗号!谢谢! 如果没有查询参数,当名为 O'Hara 的人提交表单时,您的查询将崩溃。 【参考方案1】:

set 语句的最后一行末尾有一个逗号,这是 SQL 将抱怨的地方

【讨论】:

不得不删除两者,谢谢! 我的投票让你的声望超过 100。你欠我一杯啤酒。 @DanBracuk 随时来蒙大拿州西北部告诉我。【参考方案2】:

(对于 cmets 来说太长了)

正如 cmets 中所建议的,您可以对查询进行几项改进:最大的改进之一是添加了 cfqueryparam。它提供了几个优点,例如:

CFQueryparam 或bind variables 通过鼓励数据库重复使用查询执行计划而不是每次都生成一个新的计划(这是一项代价高昂的操作)来帮助提高性能。 绑定变量还阻止执行客户端提供的值作为 SQL 命令,这具有阻止sql injection 的常见形式的令人愉快的副作用。 CF 的绑定变量实现还提供了额外的验证层,通过类型检查输入值,查询被执行。因此,当检测到无效参数时,它可以避免浪费时间访问数据库。

改进查询的其他一些技巧

尽管在语法上没有区别,但请考虑将逗号放在每行的开头,而不是结尾。这样可以更轻松地发现多余或缺少的逗号:

UPDATE SomeTable
SET    ColumnA   = 'xxxx'
       , ColumnB = 'yyyy'
       , ColumnC = 'zzzzz'
       , ColumnD = 'xxxx'
       , ColumnE = 'yyyy'
WHERE ....

您的查询似乎正在填充多个日期时间列。使用日期时间列时,最好使用日期对象,而不是字符串。日期字符串是模棱两可的,根据数据库或设置的不同,它的解释可能与您预期的不同。要仅插入日期,请​​使用&lt;cfqueryparam cfsqltype="cf_sql_date" ...&gt;,日期时间都使用&lt;cfqueryparam cfsqltype="cf_sql_timestamp" ...&gt;。显然,始终首先验证日期字符串。

考虑使用 cfqueryparam 的 null 属性。有条件地插入空值时会非常方便。 (见下面的例子)

顺便说一句,ParameterExists 不久前被弃用,取而代之的是IsDefined,或者最好是StructKeyExists。在这种情况下,CFIF 的另一种替代方法是使用cfparam 声明默认值,因此相关表单字段始终存在。

综合起来,您的最终查询可能看起来像这样。我猜到了列数据类型,所以根据需要进行调整。

UPDATE tblrequests
SET    lastname             = <cfqueryparam value="#ucase(form.lastname)#" cfsqltype="cf_sql_varchar">
      , firstname           = <cfqueryparam value="#ucase(form.firstname)#" cfsqltype="cf_sql_varchar">
      ,  middlei            = <cfqueryparam value="#ucase(form.middlei)#" cfsqltype="cf_sql_varchar">
      ,  title              = <cfqueryparam value="#form.title#" cfsqltype="cf_sql_varchar">
      ,  eod                = <cfqueryparam value="#form.eod#" cfsqltype="cf_sql_date">
      ,  dutystation        = <cfqueryparam value="#form.dutyStation#" cfsqltype="cf_sql_varchar">
      ,  requestsnetwork    = <cfqueryparam value="#form.requestsNetwork#" cfsqltype="cf_sql_bit">
      ,  affiliation        = <cfqueryparam value="#form.affiliation#" cfsqltype="cf_sql_varchar">
      ,  commentssupvreq    = <cfqueryparam value="#form.commentsSupvReq#" cfsqltype="cf_sql_varchar">
      ,  requestdelete      = <cfqueryparam value="#form.requestDelete#" cfsqltype="cf_sql_date" null="#not isDate(form.requestDelete)#">
      ,  commentssupvdelete = <cfqueryparam value="#form.commentssupvdelete#" cfsqltype="cf_sql_varchar">
      ,  commentssupvedit   = <cfqueryparam value="#form.commentssupvedit#" cfsqltype="cf_sql_varchar">
      ,  dateemailrequested = <cfqueryparam value="#form.dateEmailRequested#" cfsqltype="cf_sql_date" null="#not isDate(form.dateEmailRequested)#">
      ,  commentsit         = <cfqueryparam value="#form.commentsit#" cfsqltype="cf_sql_varchar">
      ,  bgcomplete         = <cfqueryparam value="#form.bgComplete#" cfsqltype="cf_sql_date" null="#not isDate(form.bgComplete)#">
      ,  dategroupscreated  = <cfqueryparam value="#form.dateGroupsCreated#" cfsqltype="cf_sql_date" null="#not isDate(form.dateGroupsCreated)#">
WHERE recnumber = <cfqueryparam value="#addEnt#" cfsqltype="cf_sql_integer">   

【讨论】:

是的!这。这一切。写的真好。

以上是关于使用 ## [Macromedia][SQLServer JDBC 驱动程序][SQLServer]更新错误关键字“WHERE”附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript [FIX] Macromedia Flash - 单击参数激活控件 - 单击以激活控件

Macromedia Flash 8为啥说系统时间错误不能用?

如何在 Macromedia Flash MX 中包含内置函数(例如数学)

[FIX]Macromedia Flash-单击para activar el control-单击以激活控件

如何在macromedia flash 8中复制MC

sqlser 2005 对称加密,非对称加密笔记