2016-08-17 37 views
1

我已經展示瞭如何使用Application.cfc而不是使用Application.cfm - 這很好,我喜歡學習新東西。然而,在我做出改變後,我無法弄清楚如何讓DSN正常工作。在我使用Application.cfm文件中的一組DSN之前。Application.cfc設置DSN並調用DSN

<cfparam name="DSN" default=""> 
<cfset DSN = "krl" /> 

並把它稱爲在這裏:

<CFQUERY NAME="Inital" DATASOURCE="#DSN#"> 
    SELECT Website_Name 
    FROM InitalizationData 
</CFQUERY> 

現在設置它喜歡:

component { 
    this.name = "app"; 
    this.Sessionmanagement = true; 
    this.datasource = "krl"; 

    public void function onSessionStart() { 
     // initialize cart 
     session.cart = []; 
    } 
} 

我怎麼叫出來在我的查詢?

+1

我以爲你只是以同樣的方式調用它。 'datasource =「krl」'你的例子。當你嘗試時發生了什麼?我想如果你只定義一個'datasource',那麼你甚至不必在'cfquery'標籤中指定''.this.datasource'使它成爲你的應用程序的默認值。 –

+1

在CF 9中,您使用this.datasource設置默認數據源,就像您一樣。現在您的查詢不需要指定數據源。 –

+0

*我如何在我的查詢中調用它?*您不知道。建立默認數據源的目的是爲了避免在每個cfquery中指定DSN名稱;-)如前所述,您應該省略cfquery中的「datasource」屬性,應用程序將自動使用默認的「this.datasource」 。 (注意,這個範圍在Application.cfc組件之外是不可訪問的)。(http://stackoverflow.com/a/23796613/104223)。) – Leigh

回答

0

Inside Application.cfc,你通常會添加一個函數onApplicationStart()。然後,該函數內部限定

application.dsn = "foo";

和參考它像這樣:

<cfquery name="test" datasource="#application.dsn#">

當定義該變量作爲this.datasource一個CFC內部,this範圍只存在於上下文該CFC。它不能從外面訪問。

+2

'this.datasource'有點不同。它是一個應用程序設置,用於設置默認數據源以用於Application.cfc文件中指定的應用程序。通過定義你不再需要使用'cfquery'標籤的'datasource'屬性。它將默認爲您分配的內容。它已添加到CF 9中 - [文檔](http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSd160b5fdf5100e8f790124b112a3b8b2adb-8000.html) –

-1

我可以在任何CFM頁面中使用this.datasource。例如:

<cfinsert tableName="#variables.type#s" dataSource="#this.datasource#"> 

的Application.cfc看起來是這樣的:

<cfcomponent 
    displayname="Application" 
    output="true" 
    hint="Handle the application."> 

    <!--- Set up the application. ---> 
    <cfset THIS.Name = "#cgi.server_name#" /> 
    <cfset THIS.SessionManagement = true /> 
    <cfset THIS.ApplicationTimeout = CreateTimeSpan(1, 0, 0, 0) /> 
    <cfset THIS.SessionTimeout = CreateTimeSpan(0, 0, 30, 0) /> 
    <cfset THIS.SetClientCookies = true /> 
    <!--- FOR THE DATASOURCE ---> 
    <cfset this.datasource = "MyDSN" /> 
... 
</cfcomponent> 
在常規標籤

但是你並不需要在所有指定數據源,如果是在此範圍內:

<cfquery name="get"> 
SELECT id 
FROM restaurants 
WHERE email = '#something#' 
UNION  
SELECT id 
FROM individuals 
WHERE email = '#something#' 
</cfquery> 
+0

「this'設置可訪問的情況在[其他線程](http://stackoverflow.com/a/23796613):*對於「this」中的其他設置,它們似乎可以從您的頁面訪問,因爲這些頁面被包含在application.cfc執行週期中OnRequest()方法。*但正如每個人都注意到的,這不是必要的。注意,使用'cfinsert'長期以來一直不鼓勵,主要是出於安全原因。 – Leigh

+0

哦,我明白了。而不是在cfcomponent工作中使用?我相信Request範圍是可訪問的,直到url完全處理完畢。 – Jules

+0

不完全。當你使用可選的'OnRequest'方法時,包含的頁面本質上運行在Application.cfc的上下文中。這就是爲什麼頁面可以訪問應用程序「this」範圍內的變量。但是,如果你不*使用'OnRequest',那麼這個範圍是不可訪問的,並且嘗試使用'this.datasource'將會失敗,並出現未定義的錯誤。如果你確實需要訪問這種類型的變量,那麼它可以放在'Request'範圍內。儘管對於那些很少改變的東西,比如DSN,應用程序變量可能更合適。 – Leigh