powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Отлавливание курсора
11 сообщений из 11, страница 1 из 1
Отлавливание курсора
    #33034082
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хранимка возвращает в OUT параметр хэндл на курсор, который в дальнейшем будет использоваться в веб-приложении. Сохранятся думаю он буде либо в сессии, либо во вью стэйте. Логику закрытия курсора берет на себя веб-приложение.
Такой вопрос: я так понимаю не закрывать курсор очень плохо(чем это чревато спросил в соседнем форуме по мускулю, думаю ответ будет аналогичным). Поэтому как отследить ситуацию при которой нужно закрыть курсор. Ну например когда пользователь ушел со страницы где этот курсор используется, либо вообще закрыл бровзер. Насчет перехода на другую страницу - страница, которая юзает курсор - это результат выборки организованный постранично с возможностью перехода на форму редактирования и затем возврата к результату - не хотелось бы что б при такой ситуации курсор закрывался

_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33042820
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лиман Артём...Поэтому как отследить ситуацию при которой нужно закрыть курсор. Ну например когда пользователь ушел со страницы где этот курсор используется, либо вообще закрыл бровзер...некоторые мысли по этому поводу /topic/152476&hl=
зы. по сабжу: сомневаюсь, что такой подход вообще оправдан. Для чего предполагается использовать курсор?
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33042856
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ы. по сабжу: сомневаюсь, что такой подход вообще оправдан. Для чего предполагается использовать курсор?
вариант 4
может и не оправдна, не спорю, я только начинаю работать с асп и у меня есть задание организовать нормальную постраничную выборку и поэтому пробую все варианты. Вариант с курсорами мне показался наиболее простым, но как я сейчас вижу имеет некоторые недостатки, как например - необходимо постоянно держать открытым коннект к базу, что б не пересоздавать курсор заново при новом постбэке.
Теперь поанирую попробовать вариант со временными таблицами (Вариант 2 по факу). Но и он мне что-то не очень - так как в нем при каждом постбэке приходится сначало создавать временную табличку размером с выборку, а потом ее укорачивать до нужной порции.
Мне интересно, что будет эффективнее работать - постоянное переоткрытие курсора или постоянное заполнение и укорачивание временной таблицы. Что -то мне подсказывает, что варианты примерно равносильны, так как курсор, если не ошибаюсь, также основан на временных таблицах.
Или этот вопрос лучше поднимать в форуме по мукулю?
_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33042907
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всегда использовал для выборок подобие варианта №2
в принципе, использование курсора может быть оправдано на очень больших таблицах - лично не проверял.. да и подобный вопрос разумнее, конечно, поднимать на ГФ

зы. результаты тестов интересно будет увидеть здесь
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33043054
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2profil, еще один вопрос тогда. Курсоры мне позволяли создавать динамический запрос. Тоесть я мог менять имя таблицы, условие фильтра, сортировку. Со временными таблицами, что-то не пойму как это можна организовать, так как конструкция exec('...') для временных таблиц не доступна.
Для кусора делал так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ALTER       proc RecreateCursor
@table nvarchar( 50 ) = 'Orders', --table name
@select nvarchar( 100 ) = '*',    --select statement
@filter nvarchar( 100 ) = null,   --filter condition
@order nvarchar( 50 ) = null,     --order by
@totalRows int output,		--returned row count
@handle int output 		--returned handle to cursor
as
set nocount on

declare @sql nvarchar( 200 )
set @sql ='select ' + @select +' from ' + @table
if not @filter is null and @filter <> '' 
  set @sql = @sql + ' where ' + @filter
if not @order is null and @order <> '' 
  set @sql = @sql + ' order by ' + @order
exec sp_cursoropen @handle OUT, @sql , 1 ,  1 , @totalRows OUT

_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33043109
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас под рукой нет готового примера реализации, вечерком кину

но можно использовать табличные переменные daclare @tmp table
+ я использовал sp_executesql - как-то надежнее =))
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33043181
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все вопрос отпал. в exec('') можна использовать временные таблицы.Ура!
А чем sp_executesql лучше?

_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33046181
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то что я назвал надежнее - использование параметров в sp_executesql дает возможность защиты от SQL injection
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33047910
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем от курсоров избавился вообще, и сделал мутированный вариант 2 - работаю не с локальными временными таблицами а с глобальными, дабы не дергать постоянно фильтр и сортировку. Привязываюсь к SID'у.
Есть один вопросик - хотелось по завершении сеанса подчищать табличку, но не хочется завязываться на Global.asax-> Global.Session_End(Application_End), так как нужно организовать изолированность контрола. Можна ли как-то узнать о завершении сессии не выходя из контрола? Вот если б у Page.Session(HttpSessionState) было событие типа SessionEnd то можна было бы на него подписаться, а так мне не понятно как это сделать:(
_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33053033
Фотография profil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лиман АртёмМожна ли как-то узнать о завершении сессии не выходя из контрола?может я чего-то не так понимаю, но такое сделать никак нельзя

+ глобальные временные таблицы удаляются при обрыве коннекта.
BOLCREATE TABLE ->Temporary Tables
...
Global temporary tables are automatically dropped when the session that created the table ends and all other tasks have stopped referencing them.The association between a task and a table is maintained only for the life of a single Transact-SQL statement. This means that a global temporary table is dropped at the completion of the last Transact-SQL statement that was actively referencing the table when the creating session ended.
...
Рейтинг: 0 / 0
Отлавливание курсора
    #33053112
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, у меня при закрытии коннекта табличка никуда не девается, может дело в пулинге?
_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Отлавливание курсора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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