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

Coldfusion ORM を調べてみませんか?または、コードベースへの大幅な変更をあまり必要としないものについては、DataMgr を使用できます (これは CRUD の削減に非常に役立ちます): http://datamgr.riaforge.org/

于 2012-08-16T18:44:18.910 に答える
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 に答える