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错误,该错误将为您提供该信息。