5

我有一个需要更新的表,其中所有列都可以选择传递给一个方法。

然后我使用 ColdFusion 检查是否每列都已通过并将其添加到更新查询中。

做这个的最好方式是什么?我不能总是更新 user_id 字段,因为它是一个身份字段。有没有类似于我下面设置的 1 = 1 的东西可以工作?问题只是逗号导致语法错误。

谢谢你的帮助。

update users
set 1 = 1
    <cfif len(arguments.userType)>,user_type = #arguments.userType#</cfif>
    <cfif len(arguments.primaryGroupId)>,primary_group_id = #arguments.primaryGroupId#</cfif>
    <cfif len(arguments.email)>,email = '#arguments.email#'</cfif>
    <cfif len(arguments.password)>,password = '#arguments.password#'</cfif>
    <cfif len(arguments.firstName)>,first_name = '#arguments.firstName#'</cfif>
    <cfif len(arguments.lastName)>,last_name = '#arguments.lastName#'</cfif>
    <cfif len(arguments.status)>,status = '#arguments.status#'</cfif>
    <cfif len(arguments.languageId)>,language_id = #arguments.languageId#</cfif>
    <cfif len(arguments.gmtOffset)>,gmt_offset = '#arguments.gmtOffset#'</cfif>
where user_id = #arguments.userId#
4

3 回答 3

4

如果您正在更新,并且未传递参数,则只需将其设置为当前值。

update users
set
    user_type = <cfif len(arguments.user_type)>#arguments.userType#<cfelse>user_type</cfif>
    ,primary_group_id = <cfif len(arguments.primaryGroupId)>#arguments.primaryGroupId#<cfelse>primary_group_id</cfif>
    ,email = <cfif len(arguments.email)>'#arguments.email#'<cfelse>email</cfif>
where user_id = #arguments.userId#
于 2012-06-18T17:45:18.000 回答
2

嗯...您可以计算您所做的更新次数。这将“修复”上面的查询。如:

<cfset updCt = false/>
<cfif len(arguments.usertype)>, user_type = #arguments.userType# 
    <cfset updCt = true/>
</cfif>
<cfif len(arguments.primaryGroupID)>
  <cfif updCt>,</cfif> 
    primary_group_id = #arguments.primaryGroupID# <cfset updCT = true/>
</cfif>

...你明白了。虽然很乱。我想我更有可能确保所有参数都在那里 - 传递未更改的值,以便查询更新整个数据集(或其他)。

于 2012-06-18T17:36:53.340 回答
0

如果您可以将所有参数(除了 UserID)设为可选且没有默认值,那么您可以执行以下操作:

<cffunction name="updateUser">
 <cfargument name="userID" required="true">

 <cfset argumentMap = {field1 = {name="field_1", type="cf_sql_varchar"},
                      field2 = {name="field_2", type="cf_sql_numeric"},
                      ....} />
 <!--- where field1, field2, etc will match the name 
       of the arguments to your function--->

 <cfif arrayLen(structKeyArray(arguments)) gt 1>
   <cfquery>
   UPDATE users
     SET
      <cfloop collection="#arguments#" item="arg">
         #argumentMap[arg].name# = <cfqueryparam 
                                       value="#arguments[arg]#"
                                       type="#argumentMap[arg].type#" />
      </cfloop>
     WHERE user_id = <Cfqueryparam value="#arguments.userID#" type="cf_sql_numeric"/>
   </cfquery>
 </cfif>
</cffunction>

这只会使用给定的参数执行 UPDATE 语句。

于 2012-06-18T18:49:08.943 回答