Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ServerSide cursor. ADO  [new]
Eug_ADO
Guest
Всем привет!

Такой вопрос.
Использовал ADOQuery с clientside курсором. Возникло подозрение что после выполнения и закрытия ADO не отпускает память. Это основная причина. Кроме того нет необходимости в клиентсайде, и скорость у серверсайда лучше.
Т.е. заменили на:
CursorLocation: ServerSide
CursorType: ForwardOnly
LockType: ReadOnly

Вроде стало веселей, но теперь оно не дожидается окончания выгребания данных и идёт дальше.
В итоге в случае когда:
1. создал временную таблицу
2. использовал её в джойне с большим кол-вом данных
3. удалил временную таблицу
на шаге 3 обламывается с сообщением Object was open

Как обойти данную ситуацию? Плюс возможно кто знает какие ещё камни тут могут быть?

Tx,
Eug
11 сен 09, 18:25    [7649592]     Ответить | Цитировать Сообщить модератору
 Re: ServerSide cursor. ADO  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Eug_ADO
Использовал ADOQuery с clientside курсором. Возникло подозрение что после выполнения и закрытия ADO не отпускает память. Это основная причина.

Дайте код посмотреть. Возможно, вы не делаете dispose?

Eug_ADO
Плюс возможно кто знает какие ещё камни тут могут быть?

Если вы любите использовать RecordCount после селекта, то будет облом - для серверного курсора он всегда = -1.
12 сен 09, 13:23    [7650919]     Ответить | Цитировать Сообщить модератору
 Re: ServerSide cursor. ADO  [new]
Eug_ADO
Guest
GreenSunrise,

это делфи-код. обыкновенный адодатасет. делается выборка, потом он закрывается. потом уничтожается датамодуль. насчёт dispose не уверен, умышленно по кр мере не делаю.
попробую.

а как насчёт 'Object was open'? это как-то можно обойти?

С уважением,
Eug
13 сен 09, 17:50    [7652671]     Ответить | Цитировать Сообщить модератору
 Re: ServerSide cursor. ADO  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Вообще это нормально для серверного курсора. Если данные не были выгребены до конца из рекордсета, а на этом коннекшене пытается выполниться новая команда, то для нее ADO открывает другой коннекшен. Вы можете это проверить профайлером, посмотрев событие открытия нового коннекта. Также можно вывести для дебага @@SPID сразу после селекта и сразу после попытки удаления временной таблицы. Если они разные, то это именно описанное мной поведение.

Как это обойти.
1. Доходить до конца рекордсета и только после этого выполнять новую команду.
2. Попробуйте сделать хранимую процедуру
create p1
as
begin
    <создание временной таблицы>
    select <джойн с временной таблицей>
end
и выполнять ее вместо ваших нескольких операторов. В приведенном примере время жизни временной таблицы ограничено процедурой, поэтому явного удаления не надо.
14 сен 09, 22:00    [7658058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить