Наборы строк и курсоры SQL Server
SQL Server возвращает результирующие наборы пользователям двумя способами:
Результирующие наборы по умолчанию, которые:
Сводят затраты к минимуму.
Обеспечивают максимальную производительность при извлечении данных.
Поддерживают только функции курсоров с последовательным доступом, доступных только для чтения.
Возвращают пользователю по одной строке за один раз.
Поддерживают только одну активную инструкцию за один раз для соединения.
После выполнения инструкции, другие инструкции по этому соединению можно будет выполнить только после извлечения поставщиком всех результатов или отмены этой инструкции.
Поддерживают все инструкции Transact-SQL.
Серверные курсоры, которые:
Поддерживают все функции курсоров.
Могут возвращать потребителю блоки строк.
Поддерживают несколько активных инструкций для одного соединения.
Балансируют функции курсора по производительности.
Поддержка функциональности курсоров может понизить производительность в сравнении с использованием результирующего набора по умолчанию. Этого можно избежать, если пользователь способен задействовать функции курсоров для извлечения набора строк меньшего размера.
Не поддерживают инструкций Transact-SQL, которые возвращают несколько результирующих наборов.
Пользователь может запросить другой режим работы курсора, установив определенные свойства набора строк. Если пользователь не задает ни одного из этих свойств набора строк или задает всем им значения по умолчанию, поставщик OLE DB собственного клиента SQL Server реализует набор строк при помощи результирующего набора по умолчанию. Если любому из этих свойств установлено значение, отличное от значения по умолчанию, поставщик OLE DB собственного клиента SQL Server реализует набор строк при помощи серверного курсора.
Следующие свойства набора строк указывают поставщику OLE DB собственного клиента SQL Server использовать курсоры SQL Server. Некоторые свойства можно безопасно сочетать с другими. Например, набор строк, в котором заданы свойства DBPROP_IRowsetScroll и DBPROP_IRowsetChange, будет набором строк с закладками, определяющим работу немедленного обновления. Другие свойства являются взаимоисключающими. Например, набор строк со свойством DBPROP_OTHERINSERT не может содержать закладок.
Cвойство |
Значение |
Поведение набора строк |
---|---|---|
DBPROP_SERVERCURSOR |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк является последовательным и поддерживает только прямую прокрутку и выборку. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_CANSCROLLBACKWARDS или DBPROP_CANFETCHBACKWARDS |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк поддерживает прокрутку и выборку в любом направлении. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_BOOKMARKS или DBPROP_LITERALBOOKMARKS |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк является последовательным и поддерживает только прямую прокрутку и выборку. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_OWNUPDATEDELETE или DBPROP_OWNINSERT или DBPROP_OTHERUPDATEDELETE |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк поддерживает прокрутку и выборку в любом направлении. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY. |
DBPROP_OTHERINSERT |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк поддерживает прокрутку и выборку в любом направлении. Относительное позиционирование строки поддерживается. Текст команды может включать предложение ORDER BY, если для указанных в ссылке столбцов существует индекс. Если набор строк содержит закладки, свойство DBPROP_OTHERINSERT не может иметь значение VARIANT_TRUE. При попытке создать набор строк с этим свойством видимости и закладками возникает ошибка. |
DBPROP_IRowsetLocate или DBPROP_IRowsetScroll |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк поддерживает прокрутку и выборку в любом направлении. В наборе строк поддерживаются закладки и абсолютное позиционирование при помощи интерфейса IRowsetLocate . Текст команды может содержать предложение ORDER BY. Свойства DBPROP_IRowsetLocate и DBPROP_IRowsetScroll требуют наличия закладок в наборе строк. При попытке создать набор строк с закладками и свойством DBPROP_OTHERINSERT, которому установлено значение VARIANT_TRUE возникает ошибка. |
DBPROP_IRowsetChange или DBPROP_IRowsetUpdate |
VARIANT_TRUE |
Возможно обновление данных SQL Server через набор строк. Этот набор строк является последовательным и поддерживает только прямую прокрутку и выборку. Относительное позиционирование строки поддерживается. Все команды, поддерживающие обновляемые курсоры, могут поддерживать эти интерфейсы. |
DBPROP_IRowsetLocate или DBPROP_IRowsetScroll и DBPROP_IRowsetChange или DBPROP_IRowsetUpdate |
VARIANT_TRUE |
Возможно обновление данных SQL Server через набор строк. Этот набор строк поддерживает прокрутку и выборку в любом направлении. В наборе строк поддерживаются закладки и абсолютное позиционирование при помощи интерфейса IRowsetLocate. Текст команды может содержать предложение ORDER BY. |
DBPROP_IMMOBILEROWS |
VARIANT_FALSE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк поддерживает только прямую прокрутку. Относительное позиционирование строки поддерживается. Текст команды может включать предложение ORDER BY, если для указанных в ссылке столбцов существует индекс. Свойство DBPROP_IMMOBILEROWS можно использовать только в наборах строк, которые способны показывать SQL Server строки, вставленные командами в рамках других сеансов или другими пользователями. При попытке открыть набор строк, в котором этому свойству установлено значение VARIANT_FALSE, для любого набора строк, где свойство DBPROP_OTHERINSERT не может иметь значение VARIANT_TRUE, возникает ошибка. |
DBPROP_REMOVEDELETED |
VARIANT_TRUE |
Обновление данных SQL Server через набор строк невозможно. Этот набор строк поддерживает только прямую прокрутку. Относительное позиционирование строки поддерживается. Текст команды может содержать предложение ORDER BY, если это не запрещено другим свойством. |
Набор строк поставщика OLE DB собственного клиента SQL Server, поддерживаемый серверным курсором, для базовой таблицы или представления SQL Server можно легко создать при помощи метода IOpenRowset::OpenRowset. Укажите таблицу или представление по имени, передав требуемые наборы свойств набора строк в параметре rgPropertySets.
Когда пользователь требует обеспечения поддержки набора строк серверным курсором, текст команды, которая создает набор строк, ограничен. В частности, текст команды ограничен либо одной инструкцией SELECT, которая возвращает один результирующий набор строк, либо хранимой процедурой, реализующей одну инструкциею SELECT, которая возвращает один результирующий набор строк.
В двух этих таблицах показаны сопоставления различных свойств OLE DB и моделей курсоров. В них также показано, какие свойства набора строк следует задать, чтобы использовать модель курсора определенного типа.
В каждой ячейке таблицы содержится значение свойства набора строк для определенной модели курсора. Все свойства набора строк, приведенные ранее в этом разделе, принадлежат к типу данных VT_BOOL, а их значение по умолчанию — VARIANT_FALSE. В таблице используются следующие символы:
F = значение по умолчанию (VARIANT_FALSE)
T = VARIANT_TRUE
- = VARIANT_TRUE или VARIANT_FALSE
Чтобы использовать модель курсора определенного типа, найдите столбец, соответствующий этой модели курсора, а также все свойства набора строк со значением «Т» в этом столбце. Чтобы использовать определенную модель курсора, установите этим свойствам набора строк значение VARIANT_TRUE. Свойствам набора строк, для которых в качестве значения указано «-», можно установить значение VARIANT_TRUE или VARIANT_FALSE.
Свойства набора строк/модели курсора |
Результирующий набор по умолчанию (RO) |
Быстрый forward- only (RO) |
Статические (RO) |
Keyset driven (RO) |
---|---|---|---|---|
DBPROP_SERVERCURSOR |
К |
T |
T |
T |
DBPROP_DEFERRED |
К |
К |
- |
- |
DBPROP_IrowsetChange |
К |
К |
К |
К |
DBPROP_IrowsetLocate |
К |
К |
- |
- |
DBPROP_IrowsetScroll |
К |
К |
- |
- |
DBPROP_IrowsetUpdate |
К |
К |
К |
К |
DBPROP_BOOKMARKS |
К |
К |
- |
- |
DBPROP_CANFETCHBACKWARDS |
К |
К |
- |
- |
DBPROP_CANSRCOLLBACKWARDS |
К |
К |
- |
- |
DBPROP_CANHOLDROWS |
К |
К |
- |
- |
DBPROP_LITERALBOOKMARKS |
К |
К |
- |
- |
DBPROP_OTHERINSERT |
К |
T |
К |
К |
DBPROP_OTHERUPDATEDELETE |
К |
T |
К |
T |
DBPROP_OWNINSERT |
К |
T |
К |
T |
DBPROP_OWNUPDATEDELETE |
К |
T |
К |
T |
DBPROP_QUICKSTART |
К |
К |
- |
- |
DBPROP_REMOVEDELETED |
К |
К |
К |
- |
DBPROP_IrowsetResynch |
К |
К |
К |
- |
DBPROP_CHANGEINSERTEDROWS |
К |
К |
К |
К |
DBPROP_SERVERDATAONINSERT |
К |
К |
К |
- |
DBPROP_UNIQUEROWS |
- |
К |
К |
К |
DBPROP_IMMOBILEROWS |
- |
- |
- |
T |
Свойства набора строк/модели курсора |
Dynamic (RO) |
Keyset (R/W) |
Dynamic (R/W) |
---|---|---|---|
DBPROP_SERVERCURSOR |
T |
T |
T |
DBPROP_DEFERRED |
- |
- |
- |
DBPROP_IrowsetChange |
К |
- |
- |
DBPROP_IrowsetLocate |
К |
- |
К |
DBPROP_IrowsetScroll |
К |
- |
К |
DBPROP_IrowsetUpdate |
К |
- |
- |
DBPROP_BOOKMARKS |
К |
- |
К |
DBPROP_CANFETCHBACKWARDS |
- |
- |
- |
DBPROP_CANSRCOLLBACKWARDS |
- |
- |
- |
DBPROP_CANHOLDROWS |
К |
- |
К |
DBPROP_LITERALBOOKMARKS |
К |
- |
К |
DBPROP_OTHERINSERT |
T |
К |
T |
DBPROP_OTHERUPDATEDELETE |
T |
T |
T |
DBPROP_OWNINSERT |
T |
T |
T |
DBPROP_OWNUPDATEDELETE |
T |
T |
T |
DBPROP_QUICKSTART |
- |
- |
- |
DBPROP_REMOVEDELETED |
T |
- |
T |
DBPROP_IrowsetResynch |
- |
- |
- |
DBPROP_CHANGEINSERTEDROWS |
К |
- |
К |
DBPROP_SERVERDATAONINSERT |
К |
- |
К |
DBPROP_UNIQUEROWS |
К |
К |
К |
DBPROP_IMMOBILEROWS |
К |
T |
К |
Выбор модели курсора для конкретного набора свойств набора строк определяется следующим образом.
Получите подмножество свойств, приведенных в предыдущих таблицах, из указанной коллекции свойств набора строк. Разделите эти свойства на две подгруппы, в зависимости от значения флага — обязательное (T, F) или необязательное (-) — каждого свойства набора строк. Для каждой модели курсора просмотрите первую таблицу с лева направо. Сравните значение свойств в двух этих подгруппах со значениями соответствующих свойств в этом столбце. Выбирается та модель курсора, все обязательные свойства которой совпадают, а число несовпадающих необязательный свойств минимально. При наличии нескольких моделей курсора выбирается первая слева.
Размер блока курсора SQL Server
Если курсор SQL Server поддерживает набор строк поставщика OLE DB собственного клиента SQL Server, число элементов в параметре массива дескриптора строк метода IRowset::GetNextRows или IRowsetLocate::GetRowsAt определяет размер блока курсора. Строки, указываемые дескрипторами из массива, являются элементами блока курсора.
В наборах строк, поддерживающих закладки, дескрипторы строк, которые извлекаются с помощью метода IRowsetLocate::GetRowsByBookmark, определяют элементы блока курсора.
Независимо от метода, который использовался для заполнения набора строк, и формы блока курсора SQL Server, блок курсора остается активным до выполнения для этого набора строк следующего метода извлечения строк.