使用## [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">
这是我的代码:
<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">