cfquery ColdFusion执行

时间:2011-12-02 20:50:58

标签: sql coldfusion sequences

cfquery是否在每个页面加载时执行?我问,因为我正在获取查询的序列号,然后在表单中使用它。不幸的是,每次页面加载时,查询似乎都会执行。我不希望这种情况发生。我也尝试将它放在一个cffunction中,然后从使用序列号的cfinput盒的onSubmit参数调用它,但它仍然调用序列。

以下是我尝试这样做的示例:

<cfquery name="payment_seq_num" datasource="ORCL">
        select ratner01.payment_id_seq.nextval as seq from dual
    </cfquery>
  <cfset paymentid = payment_seq_num.seq>

<cffunction name="getVetSeq" output="false">
  <cfquery name="vet_seq_num" datasource="ORCL">
        select ratner01.vet_id_seq.nextval as seq from dual
    </cfquery>
  <cfset  vet_form.VET_ID = vet_seq_num.seq>

</cffunction>

我明白为什么第一个继续递增...它在头部并且每次都被调用。但是为什么第二个会执行每个页面加载?

以下是我如何称呼它:

<cfform action="vet_output.cfm" method="post" format="html" class="cfform" name="vet_form">
    <fieldset>
        <legend>Add a Veterinarian to the Databse</legend> 
    <table>
        <tr><cfoutput>
            <td><cfinput type="hidden" name="VET_ID" onsubmit="#getVetSeq()#"></td></cfoutput>
        </tr>
        <tr>
            <td>Vet First Name:<br/> <cfinput type="text" name="VET_FNAME" maxlength="35"></td>
            <td>Vet Last name: <br/><cfinput type="text" name="VET_LNAME" maxlength="50"></td>
        </tr>
        <td><cfinput type="submit" value="Insert" name="vetSubmit"></td>
    </table>
    </fieldset>
</cfform>

所以我将它添加到输出页面并从输入页面中删除了所有相关代码,这要归功于一些建议,并且它有效......:

  <cfquery name="vet_seq_num" datasource="ORCL">
            select ratner01.vet_id_seq.nextval as seq from dual
        </cfquery>
  <cfset FORM.VET_ID = vet_seq_num.seq>
  <cfinsert name="insert_vet" datasource="ORCL" username="XX" password="XX"
    tablename="VET"
    formfields="VET_ID, VET_FNAME, VET_LNAME">

2 个答案:

答案 0 :(得分:1)

是的,所以每次加载此页面时,您都会调用该函数并获取新的序列号。因为每次加载页面#getVetSeq()#都将由ColdFusion执行。

我知道你把它放在onSubmit()中但是onSubmit()是一个JavaScript事件,它不知道ColdFusion。当JavaScript看到该代码时,该函数已被调用。如果你看起来你可能会看到JS错误,因为当你点击提交时你实际上是在调用一个不存在的函数。因为您的代码呈现如下:

onsubmit="1234"

如果您只想在提交表单时调用它,那么请在output.cfm中而不是在表单中执行。

如果由于某种原因你需要在这个页面上而不是在你的处理页面中进行,那么你需要将它作为一个Ajax调用来执行,这样它才能执行onSubmit()。

答案 1 :(得分:1)

<cfset  vet_form.VET_ID = vet_seq_num.seq>

通过method="POST"提交的表单值在名为FORM的系统结构中可用。无论分配给FORM的名称如何,它始终称为<form>。所以正确的变量名是:

FORM.VET_ID

但是,更清楚的是不从函数中访问FORM范围。只需让函数生成并返回新ID,然后将其余部分保留到调用页面。这使得功能更加模块化/可恢复。但请记住var范围内所有函数局部变量(对于ColdFusion 9+,使用Local范围)

<!--- Usage --->
<cfset FORM.VET_ID = generateNewVetID()>

<!--- Function --->
<cffunction name="generateNewVetID" output="false" returnType="numeric">
    <cfset var vet_seq_num = "">
    <cfquery name="vet_seq_num" datasource="ORCL">
        SELECT ratner01.vet_id_seq.nextval AS seq 
        FROM   dual
    </cfquery>
    <cfreturn vet_seq_num.seq>
</cffunction>