0

我必须#FORM.classid#多次克隆一个类 ID,但不是每次需要它时都编写 INSERT sql 查询,是否有任何解决方案只编写一次并用它的addClass名称调用查询?我希望我知道如何编写函数,但我是 CFML 编程的新手。

<cfquery name="currentClass" datasource="#dsn#">
        SELECT class_name, class_description
        FROM classes
        WHERE classid = <cfqueryparam value="#FORM.classid#" cfsqltype="cf_sql_numeric"> 
</cfquery>
<cfquery name="addClass" datasource="#dsn#">   
        INSERT INTO classes (class_name,class_description)
        VALUES ('#currentClass.class_name#', '#currentClass.class_description#')
</cfquery>
<cfquery name="getNewID" datasource="#dsn#">
        Select LAST_INSERT_ID() as classid
</cfquery>
4

2 回答 2

4

创建一个函数为您完成工作,然后调用该函数。如果在 ColdFusion 中制作,这就是您可以执行该功能的方式。您可以简化为达到最终目标而运行的查询数量,但我只是通过您已经在做的事情写了这个:

<cffunction name="AddTheClass" access="public" returntype="numeric">
    <cfargument name="ClassID" required="true" type="numeric" />

    <cfscript>
        var currentClass    = "";
        var addClass        = "";
        var getNewID        = "";

        var myResult        = 0;
    </cfscript>

    <cfquery name="currentClass" datasource="#dsn#">
        SELECT class_name, class_description
        FROM classes
        WHERE classid = <cfqueryparam value="#Arguments.classid#" cfsqltype="cf_sql_numeric"> 
    </cfquery>
    <cfquery name="addClass" datasource="#dsn#">   
        INSERT INTO classes (class_name,class_description)
        VALUES ('#currentClass.class_name#', '#currentClass.class_description#')
    </cfquery>
    <cfquery name="getNewID" datasource="#dsn#">
        Select LAST_INSERT_ID() as classid
        </cfquery>

    <cfset myResult = getNewID.classid />

    <cfreturn myResult />
</cffunction>

<!--- How to call it --->
<cfset intNewClassID    = AddTheClass(ClassID=Form.classid) />

编辑:您可能需要对数据源变量进行调整。有点取决于它来自哪里并且很难说,因为您没有确定该变量的范围。

于 2012-06-13T17:26:08.347 回答
3

这是一种方法。阅读文档中的函数也是一个好的开始。http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f5c.html

<cffunction name='addClass' returntype='numeric'>
    <cfargument name='ClassID' type='numeric' required='yes' />
    <cfargument name='DSN' type='string' required='yes' />

    <cfset var currentClass = '' />
    <cfset var addClass = '' />
    <cfset var getNewID = '' />

    <cfquery name="currentClass" datasource="#Arguments.dsn#">
    SELECT class_name, class_description
    FROM classes
    WHERE classid = <cfqueryparam value="#Arguments.classid#" cfsqltype="cf_sql_numeric"> 
    </cfquery>
    <cfquery name="addClass" datasource="#Arguments.dsn#">   
    INSERT INTO classes (class_name,class_description)
    VALUES ('#currentClass.class_name#', '#currentClass.class_description#')
    </cfquery>
    <cfquery name="getNewID" datasource="#Arguments.dsn#">
    Select LAST_INSERT_ID() as classid
    </cfquery>
    <cfreturn getNewID.ClassID />
</cffunction>

您还应该考虑在 cfquery 标记上使用 result 属性,因为您可以用它替换最后一个查询。http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7fae.html

如果您无法使用结果方法,那么我将使用它来确保您不会在两个查询之间遇到竞争条件。

[e] 你会注意到我在参数中添加了 DSN,因为你不应该引用函数范围之外的变量![e2] 您还应该在您的 cfqueries 中使用 cfqueryparam 标签,但我会让您更新那部分。

于 2012-06-13T17:34:37.963 回答