Coldfusion Application.cfc设置DSN并调用该DSN

Coldfusion Application.cfc设置DSN并调用该DSN,coldfusion,application.cfc,Coldfusion,Application.cfc,已经向我展示了如何使用Application.cfc而不是使用Application.cfm来实现这一点-这很好,我喜欢学习新东西。然而,在我做了更改之后,我无法弄清楚如何让DSN正常工作。在此之前,我只是在Application.cfm文件中使用了一组DSN <cfparam name="DSN" default=""> <cfset DSN = "krl" /> 如何在查询中调用它?在Application.cfc中,通常会在applicationstart中添加一

已经向我展示了如何使用Application.cfc而不是使用Application.cfm来实现这一点-这很好,我喜欢学习新东西。然而,在我做了更改之后,我无法弄清楚如何让DSN正常工作。在此之前,我只是在Application.cfm文件中使用了一组DSN

<cfparam name="DSN" default="">
<cfset DSN = "krl" />
如何在查询中调用它?

在Application.cfc中,通常会在applicationstart中添加一个函数。然后,在该函数中定义

application.dsn=foo

并这样引用:

将变量定义为CFC内的this.datasource时,this作用域仅存在于该CFC的上下文中。无法从外部访问它。

我可以在任何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>

我以为你刚才也是这么说的。datasource=krl,来自您的示例。你试的时候发生了什么?我认为,如果您只定义一个数据源,那么您甚至不必在cfquery标记中指定它。this.datasource使其成为应用程序的默认数据源。在CF 9中,您使用this.datasource设置默认数据源,就像您所做的那样。现在您的查询不需要指定数据源。如何在查询中调用它?你没有。建立默认数据源的目的是避免必须在每个cfquery中指定DSN名称;-如上所述,您应该从cfquery中省略datasource属性,应用程序将自动使用默认的ie this.datasource。请注意,@Miguel-F-这才是真正的答案。您应该将您的评论提升为官方答案。this.datasource有点不同。它是一种应用程序设置,用于设置application.cfc文件中命名的应用程序要使用的默认数据源。定义了它之后,您就不必再使用cfquery标记的datasource属性了。它将默认为您已分配的内容。它是在CF 9中添加的-可访问此设置的情况在上进行了说明:对于此中的其他设置,它们似乎可以从您的页面访问,因为页面通过OnRequest方法包含在application.cfc执行周期中。但正如大家所指出的,这是没有必要的。附带说明,长期以来,人们一直不鼓励使用cfinsert,主要是出于安全原因。哦,我明白了。而不是在CFC组件工作中使用?我相信在url完全处理之前,请求范围是可以访问的。使用可选的OnRequest方法时,包含的页面基本上在Application.cfc的上下文中运行。这就是为什么页面可以访问应用程序在此范围内的变量。但是,如果您没有使用OnRequest,则无法访问该范围,并且尝试使用this.datasource将失败,并出现未定义的错误。如果确实需要访问该类型的变量,可以将其放置在请求范围内。虽然对于一些很少改变的东西,比如DSN,应用程序变量可能更合适。Leigh-可以直接与您联系吗?好的,所以没有任何私人IM/聊天选项。我的电子邮件地址在我的个人资料中。
<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>