【问题标题】:Application.cfc setting DSN and calling that DSNApplication.cfc 设置 DSN 并调用该 DSN
【发布时间】:2016-08-17 16:52:19
【问题描述】:

已经向我展示了如何使用 Application.cfc 而不是使用 Application.cfm 来做到这一点 - 这很好,我喜欢学习新东西。然而,在我做出改变之后,我无法弄清楚如何让 DSN 正常工作。之前我只是在 Application.cfm 文件中使用了一组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 = [];
    }
}

如何在我的查询中调用它?

【问题讨论】:

  • 我以为你只是以同样的方式称呼它。 datasource="krl" 来自您的示例。当你尝试它时发生了什么?我认为如果您只定义一个datasource,那么您甚至不必在cfquery 标签中指定它。this.datasource 使其成为您应用程序的默认值。
  • 在 CF 9 中,您可以使用 this.datasource 设置默认数据源,就像您所做的那样。现在您的查询不需要指定数据源。
  • 如何在我的查询中说出它?你没有。建立默认数据源的目的是避免必须在每个 cfquery 中指定 DSN 名称;-) 如前所述,您应该从 cfquery 中省略“datasource”属性,应用程序将自动使用默认值,即this.datasource。 (旁注,the this scope is not accessible outside the Application.cfc component。)
  • @Miguel-F - 这就是答案。您应该将您的评论提升为“官方”答案。

标签: coldfusion application.cfc


【解决方案1】:

Application.cfc 中,您通常会添加一个函数onApplicationStart()。然后,在该函数内部定义

application.dsn = "foo";

并像这样引用它:

&lt;cfquery name="test" datasource="#application.dsn#"&gt;

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

【讨论】:

  • this.datasource 有点不同。它是一个应用程序设置,用于设置用于在 Application.cfc 文件中命名的应用程序的默认数据源。定义后,您不再需要使用 cfquery 标记的 datasource 属性。它将默认为您分配的内容。它是在 CF 9 中添加的 - documentation
【解决方案2】:

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

但是,在常规标签中,您根本不需要指定数据源,如果它在 THIS 范围内:

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

【讨论】:

  • this 设置可访问的情况在 other thread 中进行了说明:对于“this”中的其他设置,它们似乎可以从您的页面访问,因为这些页面是通过 OnRequest() 方法包含在 application.cfc 执行周期中。 但正如大家所指出的,这不是必需的。旁注,长期以来一直不鼓励使用cfinsert,主要是出于安全原因。
  • 哦,我明白了。而不是使用 在 cfcomponent 工作?我相信在我们完全处理完网址之前,可以访问请求范围。
  • 不完全。当您使用可选的OnRequest 方法时,包含的页面基本上在Application.cfc 的上下文中运行。这就是页面可以访问应用程序this 范围内的变量的原因。但是,如果您使用OnRequest,则无法访问该范围,并且尝试使用this.datasource 将失败并出现未定义的错误。如果您确实需要访问该类型的变量,是的,它可以放在Request 范围内。虽然对于很少改变的东西,比如 DSN,应用程序变量可能更合适。
  • Leigh - 可以直接与您联系吗?
  • AFAIK,所以没有任何私人 IM/聊天选项。我的电子邮件地址在我的个人资料中。
猜你喜欢
  • 2014-02-21
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多