【问题标题】:How to call an INSERT query by name?如何按名称调用 INSERT 查询?
【发布时间】:2012-06-16 16:49:17
【问题描述】:

我必须多次克隆一个类 ID #FORM.classid#,但不是每次我需要它时都编写 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>

【问题讨论】:

    标签: sql function coldfusion insertion cfquery


    【解决方案1】:

    创建一个函数来为您完成工作,然后调用该函数。如果在 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) />
    

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

    【讨论】:

    • @StephaneKouakou - 另外,如果您使用的是 CF8+,您可以使用 cfquery's result 属性来检索新 id 而不是 LAST_INSERT_ID()。 (编辑:Ooops 没有注意到 Busches 已经提到过 :)
    【解决方案2】:

    这是一种方法。阅读文档中的函数也是一个好的开始。 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 标签,但是我会让你更新那部分。

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多