Базы данных - Cache - статьи

       

Использование класса %Library. с Caché SQL Gateway


Для осуществления выборки из внешних источников данных, удобно использовать библиотечные классы %Library.ResultSet и %Library.DynamicQueryGW.

Пожалуй, это наиболее простой и удобный способ доступа к внешним данным в тех случаях, когда требуется только получать множество строк путем вызова SQL-команды или хранимой процедуры.  Для работы таким способом не требуется регистрировать DSN, не требуется описывать связанные таблицы, не требуется знать методы класса %SQLGatewayConnection (кроме Connect / Disconnect), используемые при работе с SQL GateWay на низком уровне. В Листинге 2 приведен пример выполнения выборки с использованием класса %ResultSet.

Листинг 2 Set Connection=##class(%SQLGatewayConnection).%New()
Set res = Connection.Connect("DSNName","username","pwd")
Set ResSet=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
Do ResSet.Prepare("SELECT * FROM TABLE",,Connection)
Do ResSet.Execute()
while ResSet.Next()

{
For i=1:1:ResSet.GetColumnCount()

{
             if (i'=ResSet.GetColumnCount())
             {
                         Write ResSet.GetData(i)_", "
             }
             else
             {
                         Write ResSet.GetData(i),!
             }

}

}
d Connection.Disconnect()

Рассмотрим этот пример по шагам:

-Сначала создается соединение с DSN для чего создается экземпляр класса %Library.SQLGatewayConnection, затем вызывается метод Connect(), которому в качестве аргументов передается имя созданного источника данных (DSN), а также, если это необходимо, имя пользователя и пароль:


Set Connection=##class(%SQLGatewayConnection).%New()
Set res = Connection.Connect("DSNName"," username", “pwd")

-Затем создаем объект класса %ResultSet

ResSet=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")

-Определяем и выполняем запрос (обратите внимание Connection, т.е. созданное SQLGateWay соединение передается третьим параметром): Do ResSet.Prepare("SELECT * FROM TABLE",,Connection)
Do ResSet.Execute()
while ResSet.Next()

{
For i=1:1:ResSet.GetColumnCount()

{
             if (i'=ResSet.GetColumnCount())
             {
                         Write ResSet.GetData(i)_", "
             }
             else
             {
                         Write ResSet.GetData(i),!
             }

}

} 

-Разрываем соединение: Do Connection.Disconnect()

Важно отметить, что объект %SQLGatewayConnection создается отдельно не случайно. Само соединение с удаленным источником данных занимает довольно много времени, поэтому было бы нерационально открывать соединение для каждого отдельного запроса.


Содержание раздела