Ваше приложение извлекает множественные наборы результатов, когда вы используете функцию SQLEXEC() более чем для одного предложения SQL SELECT или исполняете хранимые процедуры, которые выполняют множество предложений SELECT. В результате каждое предложение SQL SELECT возвращается в виде отдельного курсора Visual FoxPro.

Для первого курсора, по умолчанию, используется имя SQLRESULT; последующим курсорам присваиваются уникальные имена путем индексирования имени, используемого по умолчанию. Например, именами по умолчанию для курсоров, возвращаемых предложениями SQLEXEC( ) могут быть три набора результатов: Sqlresult, Sqlresult1 и Sqlresult2.

В пакетном режиме, если функция возвращает множественный набор результатов, имена курсоров, ответственных за каждый набор в Visual FoxPro будут иметь уникальные суффиксы и могут быть длиной до 255. Например, приведенный ниже пример устанавливает свойство BatchMode в пакетный режим, а затем выдает команду SQLEXEC( ), содержащую четыре предложения SQL SELECT, которые выстроят четыре набора результатов:

 CopyCode imageСкопировать код
? SQLSETPROP(nConnectionHandle,'BatchMode', .T.) 
? SQLEXEC(nConnectionHandle,'select * from authors ; 
                     select * from titles ; 
                     select * from roysched ; 
                     select * from titleauthor','ITEM')

Когда приведенная выше функция завершить обработку, в Visual FoxPro будут возвращены четыре набора результатов в виде курсоров Visual FoxPro - Item, Item1, Item2 и Item3.

Вы можете изменить имя, используемое по умолчанию с помощью параметра cCursorname в функциях SQLEXEC( ) или SQLMORERESULTS( ). Если указанное вами имя для набора результатов уже используется, тогда новый набор результатов перепишет существующий курсор.

Когда приложение извлекает множественные наборы результатов, вы можете выбрать либо асинхронный, либо синхронный режим обработки или либо пакетный либо не пакетный режимы.

Использование режима пакетной (Batch Mode) обработки

Свойство BatchMode, устанавливаемое с помощью SQLSETPROP(), управляет тем, как SQLEXEC() будет возвращать наборы результатов. The default value is .T., for batch mode. Batch mode processing means that Visual FoxPro doesn't return any results from a still-executing SQLEXEC( ) call until all of the individual result sets have been retrieved.

Использование режима беспакетной (Non-Batch Mode) обработки

Если вы используете SQLSETPROP( ) для установки свойства BatchMode в .F., для режима беспакетной обработки, то каждый набор результатов возвращается индивидуально. Первый набор результатов возвращается вызовом функции SQLEXEC( ). Затем ваше приложение должно периодически вызвать функцию SQLMORERESULTS( ) до тех пор, пока не будет возвращено значение 2, указывающее, что более нет  доступных результатов.

В беспакетном режиме, имя курсора может быть изменено в каждом последующем вызове SQLMORERESULTS(). В предыдущем примере, если имя первого курсора в последовательности SQLEXEC( ) было Item, а второй вызов SQLMORERESULTS( ) изменял значение параметра cCursorName в Otheritem, то результирующие наборы в этом случае будут именоваться Item, Item1, Otheritem и Otheritem1.

Следующий раздел подробно описывает режимы пакетной и беспакетной обработки в синхронном и асинхронном режимах. Приведенная ниже диаграмма предоставляет четыре возможных комбинации обработки. Числа 0, 1 и 2 представляют собой значения, возвращаемые при каждом вызове функции.

Синхронные и асинхронные режимы обработки Visual FoxPro

FoxProSynchAsynchModes screenshot

Повежение каждого типа обработки объяснено ниже: метки A, B, C и D ссылаются на колонки диаграммы. Каждое объяснение подразумевает исполнение предложения, которое возвращает три набора результатов, представленных в диаграмме тремя горизонтальными полосами.

Использование сихронной обработки

В синхронном режиме управление не возвращается приложению до тех пор, пока не будет завершено исполнение функции.

A: Синхронный пакетный режим (Synchronous Batch Mode)

Когда вы исполняете предложение SQL pass-through синхронно в пакетном режиме, управление не возвращается приложению до завершения извлечения набора результатов. Вы указываете имя первого курсора с помощью параметра cCursorname в оригинальной функции. Если указанный вами курсор уже существует, то набор результатов перепишет его. Когда вы запрашиваете множество наборов результатов в синхронном режиме, Visual FoxPro создает имена дополнительных курсоров численным индексированием имени первого курсора.

B: Синхронный беспакетный режим (Synchronous Non-Batch Mode)

Когда вы исполняете предложение SQL pass-through синхронно в беспакетном режиме, первое предложение извлекает первый набор результатов и возвращает 1. Затем вы должны периодически вызывать функцию SQLMORERESULTS( ), и можете, хотя это и необязательно, указать новое имя для курсора. Если вы не укажите новое имя для курсора, множественные имена для множественных наборов результатов создаются численным индексированием основного имени. Когда SQLMORERESULTS() возвратит значение 2, то это означает, что более нет доступных результатов.

Использование асинхронной обработки

В асинхронном режиме, ваше приложений должно продолжить вызов тех же самых функций SQL pass-through, пока не будет возвращено значение, отличное от 0 (0 означает продолжение исполнения). Имя набора результатов, которое по умолчанию равно Sqlresult, может быть изменено с помощью параметра cCursorname, при первом вызове функции. Если указанное вами имя уже используется, но новый набор результатов перепишет информацию в существующем курсоре.

C: Асинхронный пакетный режим (Asynchronous Batch Mode)

При асинхронном исполнении в пакетном режиме, каждый повторный вызов оригинальной функции будет возвращать 0 до тех пор, пока в указанные курсоры не будет возвращено множество наборов результатов. Когда все результаты будут возвращены, то оригинальная функция вернет либо число курсоров, либо отрицательное число, указывающее на ошибку исполнения.

D: Асинхронный беспакетный режим (Asynchronous Non-Batch Mode)

При асинхронной обработке в беспакетном режиме, SQLEXEC( ) вернет значение 1, когда она завершит извлечение каждого набора результатов. Ваше приложение затем должны переодически вызывать SQLMORERESULTS( ) до тех пор, пока не будет возвращено значение 2, указывающее, что более не имеется доступных результатов.

NoteСовет

Удаленные наборы результатов извлекаются в две стадии: сначала набор результатов подготавливается на сервере; затем набор результатов загружается в локальный курсор Visual FoxPro. В асинхронном режиме вы можете вызывать функцию USED( ) для проверки - начал ли Visual FoxPro заполнять запрашиваемый вами курсор.

Смотрите также