Application.cfc устанавливает DSN и вызывает этот DSN

Мне показали, как это сделать с помощью Application.cfc вместо Application.cfm — это нормально, мне нравится узнавать что-то новое. Однако после того, как я внес изменения, я не могу понять, как заставить DSN работать правильно. Раньше я просто использовал набор DSN в файле Application.cfm.

<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 = [];
    }
}

Как мне вызвать это в моих запросах?


person Thomas Nichols    schedule 17.08.2016    source источник
comment
Я думал, ты только что назвал это таким же образом. datasource="krl" из вашего примера. Что произошло, когда вы попробовали это? Я думаю, что если вы определяете только один datasource, вам даже не нужно указывать его в теге cfquery. this.datasource делает его значением по умолчанию для вашего приложения.   -  person Miguel-F    schedule 17.08.2016
comment
В CF 9 вы устанавливаете источник данных по умолчанию с помощью this.datasource, как и вы. Теперь в ваших запросах не нужно указывать источник данных.   -  person Evik James    schedule 17.08.2016
comment
Как я могу указать это в своих запросах? Вы этого не сделаете. Цель установки источника данных по умолчанию состоит в том, чтобы избежать необходимости указывать имя DSN в каждом cfquery ;-) Как уже упоминалось, вы должны опустить атрибут источника данных из вашего cfquery, и приложение автоматически будет использовать значение по умолчанию, т.е. this.datasource. (Примечание: область this недоступна за пределами компонента Application.cfc.)   -  person Leigh    schedule 18.08.2016
comment
@ Miguel-F - Это действительно ответ. Вы должны продвигать свой комментарий к официальному ответу.   -  person Leigh    schedule 20.08.2016


Ответы (2)


Внутри Application.cfc вы обычно добавляете функцию onApplicationStart(). Затем внутри этой функции определите

application.dsn = "foo";

И ссылайтесь на него так:

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

Когда вы определяете переменную как this.datasource внутри CFC, область действия this существует только в контексте этого CFC. Он недоступен извне.

person Adrian J. Moreno    schedule 17.08.2016
comment
this.datasource немного отличается. Это параметр приложения, который задает источник данных по умолчанию для использования приложением, указанным в файле Application.cfc. После его определения вам больше не нужно использовать атрибут datasource тега cfquery. По умолчанию будет то, что вы назначили. Он был добавлен в CF 9 — документация - person Miguel-F; 17.08.2016

Я могу использовать this.datasource на любой странице CFM. Пример:

<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>
person Jules    schedule 22.08.2016
comment
Обстоятельства, при которых доступны настройки this, были объяснены в другом потоке: Для других настроек в этом они кажутся быть доступным с ваших страниц, так как страницы включаются в цикл выполнения application.cfc методом OnRequest(). Но, как все уже заметили, это не обязательно. Примечание: использование cfinsert уже давно не рекомендуется, в первую очередь по соображениям безопасности. - person Leigh; 22.08.2016
comment
О, я вижу. Вместо использования ‹cfset this.datasource = MyDSN /› будет ли работать ‹cfset request.datasource = MyDSN /› в cfcomponent? Я считаю, что область запроса доступна до тех пор, пока URL-адрес не будет полностью обработан. - person Jules; 22.08.2016
comment
Не совсем. Когда вы используете необязательный метод OnRequest, включенные страницы по существу выполняются в контексте Application.cfc. Вот почему страница может обращаться к переменным в области this приложения. Однако если вы не используете OnRequest, эта область будет недоступна, и попытки использовать this.datasource завершатся ошибкой undefined. Если вам действительно нужен доступ к этому типу переменной, да, ее можно поместить в область видимости Request. Хотя для вещей, которые редко меняются, таких как DSN, переменная приложения, вероятно, более уместна. - person Leigh; 22.08.2016
comment
Ли - можно ли связаться с вами напрямую? - person Jules; 22.08.2016
comment
Насколько мне известно, у SO нет приватных вариантов обмена мгновенными сообщениями/чата. Мой адрес электронной почты находится в моем профиле. - person Leigh; 22.08.2016