ColdFusion:通用更新模式

ColdFusion:通用更新模式,coldfusion,Coldfusion,我通常创建这样的更新语句。但我知道有更好的办法。我怎么能同意这一点*注意下面的示例是伪演示,可能无法运行 <cffunction name="updateEmp" returntype="void"> <cfargument name="empId" required="yes" hint="empId"> <cfargument name="firstName" required="yes" hint="firstName"> <

我通常创建这样的更新语句。但我知道有更好的办法。我怎么能同意这一点*注意下面的示例是伪演示,可能无法运行

<cffunction name="updateEmp" returntype="void">
    <cfargument name="empId" required="yes" hint="empId">
    <cfargument name="firstName" required="yes" hint="firstName">
    <cfargument name="lastName" required="yes" hint="lastName">

    <!--- Get emp details in db --->
   <cfquery datasource="#ds#" name="getEmployee">
        SELECT *
        FROM Employee
        WHERE  emp_id = <cfqueryparam
                value="#arguments.empId#" 
                CFSQLType="CF_SQL_INTEGER">
    </cfquery>

    <!--- If employee is in db or if emp db details are different --->
    <cfif getEmployee.recordCount eq 1 
            and getEmployee.firstName neq trim(arguments.firstName) 
             or getEmployee.lastName  neq trim(arguments.lastName)>

        <cfquery name="UpdateExistingEmployee" datasource="#ds#">

                UPDATE Employee
                SET 1 = 1
                    <cfif getEmployee.firstName neq trim(arguments.firstName)>
                        ,firstName = <cfqueryparam 
                                    value="#arguments.firstName#" 
                                    CFSQLType="CF_SQL_VARCHAR" >
                    </cfif>

                    <cfif getEmployee.lastName neq trim(arguments.lastName)>
                        ,lastName = <cfqueryparam 
                                    value="#arguments.lastName#" 
                                    CFSQLType="CF_SQL_VARCHAR" >
                    </cfif>

                WHERE emp_id=<cfqueryparam
                    value="#emp_id#" 
                    CFSQLType="CF_SQL_INTEGER">

        </cfquery>

    </cfif>
    <!--- maybe return success? --->
</cffunction>

挑选*
来自员工
其中emp_id=
更新员工
设置1=1
,firstName=
,lastName=
emp_id在哪里=
编辑:

<cffunction name="updateEmp" returntype="void">
        <cfargument name="empId" required="yes" hint="empId">
        <cfargument name="firstName" required="yes" hint="firstName">
        <cfargument name="lastName" required="yes" hint="lastName">

            <cfquery name="UpdateExistingEmployee" datasource="#ds#">

                    UPDATE Employee
                        SET firstName = <cfqueryparam 
                                        value="#arguments.firstName#" 
                                        CFSQLType="CF_SQL_VARCHAR" >

                            ,lastName = <cfqueryparam 
                                        value="#arguments.lastName#" 
                                        CFSQLType="CF_SQL_VARCHAR" >

                    WHERE emp_id=<cfqueryparam
                        value="#emp_id#" 
                        CFSQLType="CF_SQL_INTEGER">

            </cfquery>

        <!--- maybe return success? --->
    </cffunction>

更新员工
SET firstName=
,lastName=
emp_id在哪里=

不确定您想要改进什么。如果您只想编写更少的代码,您可以执行以下更新:

<cffunction name="updateEmp" returntype="void">
    <cfargument name="empId" required="yes" hint="empId">
    <cfargument name="firstName" required="yes" hint="firstName">
    <cfargument name="lastName" required="yes" hint="lastName">
    <cfquery name="UpdateExistingEmployee" datasource="#ds#">
      UPDATE Employee
      SET firstName = <cfqueryparam value="#arguments.firstName#" CFSQLType="CF_SQL_VARCHAR">
          ,lastName = <cfqueryparam value="#arguments.lastName#" CFSQLType="CF_SQL_VARCHAR" >
      WHERE emp_id=<cfqueryparam value="#emp_id#" CFSQLType="CF_SQL_INTEGER">
    </cfquery>
</cffunction>

更新员工
SET firstName=
,lastName=
emp_id在哪里=

对现有记录的检查几乎是多余的,因为where子句将在没有emp_id匹配的情况下阻止任何操作,为什么还要检查名称是否匹配呢?如果他们这样做了,那么你只是更新了他们,使他们保持不变,如果他们不更新,你无论如何都要更新他们。没有逻辑上的理由去做所有的检查。

也许可以检查一下Coldfusion表单?或者,对于需要对代码库进行不太剧烈的更改的内容,可以使用DataMgr(这确实有助于减少CRUD):

您认为这方面存在哪些问题需要改进?此外,表格可能会在select和update语句之间更改。好的,是真的。我有一个奇怪的想法,如果提交表单中的值完全相同,就不应该更新值。还有,您是否从update语句返回任何值,例如updated id?我认为,如果您有一种不调用db就知道的方法(比如内存中已经有了Employee表),那么是的,请避免它。运行查询没有太多的开销,但总会有一些开销,因此我的意见是,最好尽可能减少查询的数量。如果需要,您可以返回更新ID,但是您将ID作为参数输入,因此您已经知道它,没有太多理由这样做。如果查询运行成功与否,您可以输入try/catch并返回一个布尔值。但事实上,一个失败将触发一个CF错误,该错误将为您提供该信息。