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

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

зы. результаты тестов интересно будет увидеть здесь
...
Рейтинг: 0 / 0
29.04.2005, 15:03
    #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
29.04.2005, 15:28
    #33043109
profil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отлавливание курсора
сейчас под рукой нет готового примера реализации, вечерком кину

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

_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
03.05.2005, 14:14
    #33046181
profil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отлавливание курсора
то что я назвал надежнее - использование параметров в sp_executesql дает возможность защиты от SQL injection
...
Рейтинг: 0 / 0
04.05.2005, 12:52
    #33047910
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отлавливание курсора
вообщем от курсоров избавился вообще, и сделал мутированный вариант 2 - работаю не с локальными временными таблицами а с глобальными, дабы не дергать постоянно фильтр и сортировку. Привязываюсь к SID'у.
Есть один вопросик - хотелось по завершении сеанса подчищать табличку, но не хочется завязываться на Global.asax-> Global.Session_End(Application_End), так как нужно организовать изолированность контрола. Можна ли как-то узнать о завершении сессии не выходя из контрола? Вот если б у Page.Session(HttpSessionState) было событие типа SessionEnd то можна было бы на него подписаться, а так мне не понятно как это сделать:(
_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
06.05.2005, 15:24
    #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
06.05.2005, 15:47
    #33053112
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отлавливание курсора
хм, у меня при закрытии коннекта табличка никуда не девается, может дело в пулинге?
_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Отлавливание курсора / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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