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

Update error using ## [Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near the keyword 'WHERE'

这是我的代码:

    <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>

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

Error Executing Database Query. [Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near the keyword 'WHERE'.

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

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

(评论太长)

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

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

改进查询的一些其他技巧

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

    UPDATE SomeTable
    SET    ColumnA   = 'xxxx'
           , ColumnB = 'yyyy'
           , ColumnC = 'zzzzz'
           , ColumnD = 'xxxx'
           , ColumnE = 'yyyy'
    WHERE ....
    
  • 看起来您的查询正在填充多个日期时间列。使用日期时间列时,最好使用日期 objects,而不是字符串。日期字符串是不明确的,根据数据库或设置的不同,其解释可能与您预期的不同。要仅插入日期,请​​使用 <cfqueryparam cfsqltype="cf_sql_date" ...>,日期 时间都使用 <cfqueryparam cfsqltype="cf_sql_timestamp" ...>。显然,始终首先验证日期字符串。

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

  • 顺便说一句,ParameterExists was deprecated a while ago and replaced with IsDefined, or preferably StructKeyExists. In this case, another alternative to a CFIF is to declare a default with 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">