0

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

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

编辑:

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

2 回答 2

1

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

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

检查现有记录几乎是多余的,因为如果没有 emp_id 匹配,where 子句将阻止任何操作,为什么还要检查名称是否匹配?如果他们这样做,那么您只需将它们更新为相同,如果他们不这样做,您无论如何都要更新它们。做所有这些检查没有合乎逻辑的理由。

于 2012-08-15T23:35:04.313 回答
1

也许看看 Coldfusion ORM?或者,对于需要对代码库进行不太剧烈更改的内容,您可以使用 DataMgr(这确实有助于减少 CRUD):http ://datamgr.riaforge.org/

于 2012-08-16T18:44:18.910 回答