2016-08-17 65 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