powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / чем отличается серверный курсор от клиентского для ADO
16 сообщений из 16, страница 1 из 1
чем отличается серверный курсор от клиентского для ADO
    #32859593
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь может дать ясное объяснение :
чем отличается серверный курсор от клиентского для ADO (или другой технологии)?

Как - то так выясняется , что ничего неясно по этому поводу.
В справке практически ничего для ADODB->Recordset->CursorLocation свойства не описано по этому поводу.

Смотрел в Profiler при разных соединениях c MSSQL Server :
оказалось, что при соединении при задании провайдера "Provider=sqloledb;"
при recordset.CursorLocation=adUseServer при окрытиии рекордсета идет вызов типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
declare @P1 int
set @P1= 180150000 
declare @P2 int
set @P2= 1 
declare @P3 int
set @P3= 16386 
declare @P4 int
set @P4= 43 
exec sp_cursoropen @P1 output, N'select * from employee', @P2 output, @P3 output, @P4 outputselect @P1, @P2, @P3, @P4



Как я понял , это ADODB API к SQL серверу.
Кстати при заданиии при соединении другого провайдера "Provider=MSDataShape.1"
этого вызова API не происходит, даже если стоит recordset.CursorLocation=adUseServer

Короче, в чем суть-то этих понятий: клиентский и серверный курсор ?
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32859761
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиентский - все запрошенные записи тащатся на клиента.
Серверный - это именно курсор. Т.е. на серваке действительно открывается курсор(из твоего же кода профалера прекрасно видно) и на клиента фетчится только текущая запись.

Отличий у них много и области применения различны. Клиентский работает обычно быстрее(после получения записей, т.к. если их много процесс открытия может затянутся), серверный же точнее, т.е. дает возможность видеть наиболее актуальные данные в базе(клиентский - статический снимок таблицы).
Для серверного нужно постоянно держать соеденение открытым, на что тратятся ресурсы как клиента так и сервера. И напротив, клиентскому курсору соеденение нужно только для открытия и при необходимости - апдейта. Отсоедененные рекордсеты наиболее часто применяются, очень практичная штука.

Это если коротко.


Magnus
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32859876
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серверный - это именно курсор. Т.е. на серваке действительно открывается курсор(из твоего же кода профалера прекрасно видно) и на клиента фетчится только текущая запись.

А почему же этого не видно при использовании другого провайдера ("Provider=MSDataShape.1") ?

Вообще-то мне кажется , что курсор в любом случае открывается на сервере - для выборки записей без этого ведь нельзя. Только вот трассировка Profiler'а смущает.
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32859895
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yuniki
Вообще-то мне кажется , что курсор в любом случае открывается на сервере - для выборки записей без этого ведь нельзя. Почему же ? Курсор открывается тогда, когда необходима навигация по записям. На стороне сервера это чаще не надо, чем надо.
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32859941
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yunikiВообще-то мне кажется , что курсор в любом случае открывается на сервере - для выборки записей без этого ведь нельзя
Можно. Обычный запрос возвращает набор записей статическому рекордсету.


Magnus
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32859960
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открывается курсор - для меня не совсем понятная вещь.
Я имел ввиду , что для выполнения любого запроса ведь все-равно нужно открыть некий внутренний курсор (типа sp_cursoropen) для извлечения записей и он ,конечно, всегда на сервере.

Вопрос по поводу разных провайдеров остается без ответа ?
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32860173
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтоб все толком обьяснить тут нужно пару глав написать. Для начала тебе не хватает элементарных понятий СУБД.

Как я уже говорил, для получаения набора записей из базы, достаточно запроса. Но если есть необходимость выбитать записи последовательно, по одной, то в этом случае отркывается курсор - некий цикл перебираающий записи соответствующие твоему условию.
sp_cursoropen как раз и открывает такой курсор.

Провайдер MSDataShape испольуется для построения иерархических наборов данных на стороне клиента, естественно ему нужно ВСЕ данные одновремено, и именно клиентской стороне, а не последовательная их выборка. Поэтому установка CursorLocation=adUseServer не учитывается. И если после открытия рекордсета ты проверишь это свойство то увидишь что получил статический рекордсет находящийся полностью на клиенте.

Собственно "Клиентский курсор" - понятие чисто умозрительное, принятое по аналогии, в этом случае реально никакого курсора не создается. Его подобием можно считать рекордсет содержащий данные на клиенте и имеющий возможность навигации по набору как и серверный курсор.



Magnus
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32861078
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Magnus23 >

1) Чтоб все толком обьяснить тут нужно пару глав написать. Для начала тебе не хватает элементарных понятий СУБД.

Где-то есть противоречие в этих двух предложениях (Если понятия элементарные, то зачем-же пару глав). Но пускай...
Да, так вот, если понятия элементарные, то нельзя ли узнать , где о них можно толком почитать в документации (ну или в др местах) - я ни в BOL по MsSQL, ни в ADO доке - не нашел. Точнее то, что нашел - практически ничего не объясняет по организации механизма их работы.

2)Провайдер MSDataShape испольуется для построения иерархических наборов данных на стороне клиента, естественно ему нужно ВСЕ данные одновремено, и именно клиентской стороне, а не последовательная их выборка.

За это объяснение спасибо, только ,как мне кажется, намек на последовательную их выборку,точнее на то, что при серверном курсоре есть некий перебирающий цикл, а при клиентском нет, лишний.
Я пока так понимаю,что :
Во-первых, понятия "клиентский курсор" или "серверный курсор" нельзя путать с понятием "курсор" в T-SQL ;
Во-вторых, а раз, так, то , что при "клиентском" , что при "серверном" - без разницы происходит работа какого-то внутреннего ,как я его назвал, цикла, выбирающего записи. При серверном этот внутренний цикл работает на сервере , при клиентском - на клиенте на его внутренний кэш.

Или все-же я не прав в том смысле, что функция API OLEDB sp_cursoropen все же создает и открывает на MSSQL Server курсор в понятиях T-SQL ?
Твои слова Собственно "Клиентский курсор" - понятие чисто умозрительное, принятое по аналогии, в этом случае реально никакого курсора не создается. намекают именно на это ?

Но Саму-то sp_cursoropen нельзя ведь внутри видеть и Profiler не покажет... - где искать док-ва ?
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32861153
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно BOL и нужно читать. Курсоры, запросы...

авторВо-первых, понятия "клиентский курсор" или "серверный курсор" нельзя путать с понятием "курсор" в T-SQL ;
Во-вторых, а раз, так, то , что при "клиентском" , что при "серверном" - без разницы происходит работа какого-то внутреннего,как я его назвал, цикла, выбирающего записи. При серверном этот внутренний цикл работает на сервере , при клиентском - на клиенте на его внутренний кэш.
Или все-же я не прав в том смысле, что функция API OLEDB sp_cursoropen все же создает и открывает на MSSQL Server курсор в понятиях T-SQL ?
Твои слова Собственно "Клиентский курсор" - понятие чисто умозрительное, принятое по аналогии, в этом случае реально никакого курсора не создается. намекают именно на это ?


Верно и то и другое. Серверный курсор это действительно курсор, т.е. Т-SQL курсор как ты его называешь. АДО открывает его и фетчит из него записи.

Magnus
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32861221
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строго говоря sp_cursoropen != DECLARE ... CURSOR FOR ... OPEN cursorName
О чем BOL и говорит
BOLThese system stored procedures support the cursor functionality of ADO, OLE DB, ODBC, and the DB-Library Cursor Library:

sp_cursor sp_cursorclose sp_cursorexecute
sp_cursorfetch sp_cursoropen sp_cursoroption
sp_cursorprepare sp_cursorunprepare

sp_cursoropen - это Extended SP сервера, его API, используемая ADO, ODBC etc. Не T-SQL команда

Если кому интересно, можно почитать раздел BOL API Server Cursors

yunikiВо-вторых, а раз, так, то , что при "клиентском" , что при "серверном" - без разницы происходит работа какого-то внутреннего,как я его назвал, цикла, выбирающего записи. При серверном этот внутренний цикл работает на сервере , при клиентском - на клиенте на его внутренний кэш.
Курсор - есть структура, предназаначенная для навигации по записям. Происхождение ее - навигационные, файл серверные системы. Когда физическое расположение записи в файле имело значение. SQL же (а с ним и оперирует MSSQL Server) - это Set-oriented язык, оперирующий множествами _строк_ (а не записей) Поэтому в документации ADO в основном упоминаются Records, а в BOL - Rows. Смысл разный. Вот отличное объяснение разницы между этими понятиями, данное Joe Celko

К чему я это ?
Неизвестно как работает внутренний механизм SQLServera, возвращающий множество строк в ответ на запрос клиента. Но называть его курсором или циклом - неверно.
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32862941
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Kudinov
Строго говоря sp_cursoropen != DECLARE ... CURSOR FOR ... OPEN cursorName
Если говорить буквально то да, !=, но если открыть эти хранимки то внутри вероятнее всего окажется тот же синтакс.

Alexey Kudinov
Неизвестно как работает внутренний механизм SQLServera, возвращающий множество строк в ответ на запрос клиента. Но называть его курсором или циклом - неверно.
О том я и говорю, можно сейчас зарытся в дебри и недели из них не выласить. Цикл - только для упрощения понятия.


Magnus
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32862970
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23 Alexey Kudinov
Строго говоря sp_cursoropen != DECLARE ... CURSOR FOR ... OPEN cursorName
Если говорить буквально то да, !=, но если открыть эти хранимки то внутри вероятнее всего окажется тот же синтакс.
Не факт. Неизвестно.
sp_cursoropen - это extended SP, я думаю, что она работает на более низком уровне, чем просто интерфейс к DECLARE ... CURSOR
Но это гадание на кофейной гуще, к тому же не имеющее практического значения
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32863650
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sourceforgeSystem stored procedures
This document contains information on undocumented stored procedures in Microsoft SQL Server.

Name Function
sp_cursor Update a cursor
sp_cursorclose close a cursor
sp_cursorexecute Open a prepared cursor
sp_cursorfetch Fetch rows
sp_cursoropen Open a cursor
sp_cursoroption Set cursor options
sp_cursorprepare Prepare a cursor statement
sp_cursorprepexec Prepare a cursor statement and open
sp_cursorunprepare Free a prepared cursor statement
sp_execute Execute a prepared statement
sp_prepare Prepare an SQL statement
sp_prepexec Prepare and execute an SQL statement
sp_unprepare Free a prepared statement

sp_cursoropen
Defines the attributes of an API server cursor, such as its scrolling behavior and the statement used to build the result set on which the cursor operates, then populates the cursor. The statement can contain embedded parameters.

Syntax
sp_cursoropen [@cursor =] cursor_handle OUTPUT,
[@stmt =] 'stmt'
[, [@scrollopt =] scroll_options OUTPUT]
[, [@ccopt =] concurrency_options OUTPUT]
[, [@rowcount =] rowcount OUTPUT]

[
{, [@paramdef =] N'parameter_name data_type [,...n]' }
{, [@param1 =] value1 [,...n] }

]

Arguments
[@cursor =] cursor_handle OUTPUT
Is the name of a declared integer variable to receive the cursor handle. cursor_handle is int, with no default.
[@stmt =] 'stmt'
Is a string containing a single SELECT statement or a single stored procedure call. The size of the string is limited only by available database server memory. stmt can contain parameters having the same form as a variable name, for example:

'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'

Each parameter included in stmt must have a corresponding entry in both the @paramdef parameter definition list and the parameter values list.

[@scrollopt =] scroll_options OUTPUT
Is the cursor scroll type. scroll_options is int with a default of 1 (keyset-driven), and can be a combination of these values (exactly one of the first 5 must be specified).

Value Description
0x0001 Keyset-driven cursor.
0x0002 Dynamic cursor.
0x0004 Forward-only cursor.
0x0008 Static cursor.
0x0010 Fast forward-only cursor.
0x1000 Parameterized query.
0x2000 Auto fetch.
0x4000 Auto close.
0x8000 Check acceptable types.
0x10000 Keyset-driven acceptable.
0x20000 Dynamic acceptable.
0x40000 Forward-only acceptable.
0x80000 Static acceptable.
0x100000 Fast forward-only acceptable.

On return, @scrollopt contains the type of cursor actually created, which may not match what was requested.
[@ccopt =] concurrency_options OUTPUT
Is the cursor concurrency. concurrency_options is int, with a default of 4 (optimistic) and can be a combination of these values (exactly one of the first 4 must be specified).

Value Description
0x0001 Read-only.
0x0002 Scroll locks.
0x0004 Optimistic. Checks timestamps and, when not available, values.
0x0008 Optimistic. Checks values (non-text, non-image).
0x2000 Open on any SQL.
0x4000 Update keyset in place.
0x10000 Read-only acceptable.
0x20000 Locks acceptable.
0x40000 Optimistic acceptable.

On return, @ccopt contains the type of cursor actually created, which may not match what was requested.
[@rowcount =] rowcount OUTPUT
Is the name of a declared integer variable to receive the number of affected rows. rowcount is int with no default value.
[@paramdef =] N'parameter_name data_type [,...n]'
Is one string that contains the definitions of all parameters that have been embedded in stmt. Each parameter definition consists of a parameter name and a data type. n is a placeholder indicating additional parameter definitions. Every parameter specified in stmt must be defined in @paramdef. If the Transact-SQL statement in stmt does not contain parameters, @paramdef is not needed. The default value for this parameter is NULL.
[@param1 =] value1
Is a value for the first parameter defined in the parameter string. The value can be a constant or a variable. There must be a parameter value supplied for every parameter included in stmt. The values are not needed if the Transact-SQL statement in stmt has no parameters.
n
Is a placeholder for the values of additional parameters. Values can be only constants or variables. Values cannot be more complex expressions such as functions, or expressions built using operators.
Return Code Values
0 (success) or 1 (failure).

Result Sets
Returns the result set generated by stmt, but containing no rows.

Remarks
sp_cursoropen is a more powerful (and programmatic) way of creating server-side cursors on SQL Server.
Что говорит о следующем: даже если внутренний механизм и отличается(что вполне вероятно) то результат абсолютно тот же - открытие курсора. О чем ИМХО мы и говорили.


Magnus
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32863695
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23
Что говорит о следующем: даже если внутренний механизм и отличается(что вполне вероятно) то результат абсолютно тот же - открытие курсора. О чем ИМХО мы и говорили.
Согласен
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32863894
Мшсещырф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Magnus23
для firehose cursor's - курсоров на сервере не открывается.
...
Рейтинг: 0 / 0
чем отличается серверный курсор от клиентского для ADO
    #32863933
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мшсещырф2 Magnus23
для firehose cursor's - курсоров на сервере не открывается.
Ну да, там немного другое, поток данных от сервера к клиенту.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / чем отличается серверный курсор от клиентского для ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]