2016-05-18 17 views
1

Ein paar Mal in meiner Funktion Ich habe Sachen wie diese:Var Scoping-Problem möglicherweise?

<cffunction name="mergeData"> 
<cfquery name="myQuery"> 
SELECT columnName FROM tableName 
</cfquery> 

<cfquery dbtype="query" name="myOtherQuery"> 
SELECT columnName FROM myQuery 
</cfquery> 
</cffunction> 

<cfset resulta = mergeData(queryA) /> 
<cfset resultb = mergeData(queryB) /> 
<cfset resultc = mergeData(queryC) /> 

Gelegentlich dann erhalte ich die Fehler The select column reference [myQuery.columnname] is not found in table [myQuery].

Also, was dies verursacht werden könnte. Wie kann ich diagnostizieren? Ich dachte, es könnte ein Scoping-Problem sein, also werde ich <cfquery name="local.myQuery"> hinzufügen, nur um sicherzustellen, dass die Dinge in der Funktion enthalten sind (ich sollte das sowieso wahrscheinlich tun). Aber wenn etwas nur passiert, fällt es mir manchmal schwer herauszufinden, wie man es diagnostiziert.

BEARBEITEN: Ein wenig Klarheit darüber, warum es sich höchstwahrscheinlich um ein Scoping-Problem handelt. Mein Gedanke ist, dass myQuery möglicherweise in anderen Anrufen referenziert wird. Ich meine, es ist nicht so, als würde es mehrere Threads auf den Daten laufen lassen, aber ist es möglich, dass das der Grund sein könnte? Gibt es andere Ursachen? Dies ist nicht immer der Fall, wenn ich den Fehler erhalte. Ich bekomme es auch auf einer Seite, wo es nur einmal läuft.

+0

Ich lokalisierte alles lokal, machte die Variablennamen einzigartig für jede Funktion und die Fehler gingen weg. (zumindest in den letzten 5 Stunden.) Ich hoffe, das bedeutet, dass es das Problem war. – Leeish

Antwort

3

Verwenden Sie in der Abfrage von Abfragen Klammern um das local-Bereichspräfix.

<cffunction name="mergeData"> 
    <cfquery name="local.myQuery"> 
     SELECT columnName FROM tableName 
    </cfquery> 

    <cfquery dbtype="query" name="local.myOtherQuery"> 
     SELECT columnName FROM [local].myQuery 
    </cfquery> 
</cffunction> 

<cfset resulta = mergeData(queryA) /> 
<cfset resultb = mergeData(queryB) /> 
<cfset resultc = mergeData(queryC) />
+0

Danke, ich werde das versuchen, aber trotzdem, irgendwelche Gedanken zu den Fehlern? – Leeish

+0

Außerdem scheint 'SELECT [local] .myQuery.columnName' nicht zu funktionieren. Wenn Sie also tun, was Sie gesagt haben, wie verweisen Sie auf Spalten? Zum Beispiel habe ich in meiner Where-Klausel 'myQuery.columnName'. Ich kann es nicht mit 'local' arbeiten lassen, egal wie ich es formatiere. – Leeish

+0

@Leeish - Ein einfacher 'SELECT columnName VON [local] .myQuery' sollte gut funktionieren. Es sei denn, dein echter Code macht etwas komplizierteres als das, was du gepostet hast. Wenn ja, könntest du deine Frage aktualisieren? – Leigh

1

Ich habe nie LOCAL in Abfrage von Abfragen in einer Funktion arbeiten.

Also das ich tun ....

<cffunction> 
<cfquery name="VARIABLES.myQuery"> 
SELECT columnName FROM tableName 
</cfquery> 

<cfquery dbtype="query" name="myOtherQuery"> 
SELECT columnName FROM VARIABLES.myQuery 
</cfquery> 
<cffunction> 

empfehle ich einen klareren Namen für die Abfrage mit, vor allem in Abfrage von Abfragen.

+0

Ich habe mich gerade gefragt, denn wenn ich versuche, local zu verwenden, erhalte ich einen Fehler im lokalen Teil. – Leeish

+0

Meistens bin ich gezwungen, SELECT * in Abfrage von Abfragen zu verwenden. Ich denke, es gibt einige echte Einschränkungen mit QofQ von ColdFusion. –

+0

Was meinen Sie mit expliziten Namen? – Leeish