Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
При вызове SQLColumns() получаю сообщение
"[Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt."

Строчкой раньше стоит открытие CRecordset. До этой строчки точно такое же SQLColumns() отрабатывает нормально (и его курсор закрывается).

Упомянутый CRecordset специально сделан не forwafdonly (и я проверил, MoveFirst() и MoveLast() отрабатывают).

Для hstmt от SQLColumns() пытался устанавливать SQL_ATTR_CURSOR_TYPE = SQL_CURSOR_STATIC, вроде получилось, но не помогло.

Два аналогичных CRecordset-a нормально открываются и работают параллельно.

Что делать?
28 сен 11, 17:44    [11350309]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Что делать?

Выбирать на клиента все результаты предыдущей команды
28 сен 11, 17:46    [11350319]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
Glory,

Да, есть такой вариант. Но он мне неинтересен. Мне нужно "выбирать" результаты двух команд параллельно.

И это возможно. Я об этом писал ("Два аналогичных CRecordset-a нормально открываются и работают параллельно.").
28 сен 11, 17:57    [11350418]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Да, есть такой вариант. Но он мне неинтересен. Мне нужно "выбирать" результаты двух команд параллельно.

В одном коннекте это невозможно. Нужно два
28 сен 11, 17:59    [11350441]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
И это возможно. Я об этом писал ("Два аналогичных CRecordset-a нормально открываются и работают параллельно.").

Вы путаете логические объекты с физическими коннектами
28 сен 11, 18:00    [11350449]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
автор
Вы путаете логические объекты с физическими коннектами

А также тёплое с мягким. Увы.

Отрицаете ли Вы, что возможно одновременно открыть два CRecordset-a на одном подключении?
Если да, то дальше мне неинтересно (предпочитаю верить своим глазам).
28 сен 11, 18:08    [11350517]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ой Вэй,

можно, если провайдер потдерживает режим MARS и этот режим включен.
28 сен 11, 18:11    [11350533]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
iljy,

видимо, поддерживает и включён. Но два CRecordset-a не мешают друг другу, а один CRecordset мешает последующему SQLColumns(). Хотя тот вроде бы тоже cursor. Хотелось бы понять в чём причина и нельзя ли её обойти.
28 сен 11, 18:16    [11350563]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Отрицаете ли Вы, что возможно одновременно открыть два CRecordset-a на одном подключении?
Если да, то дальше мне неинтересно (предпочитаю верить своим глазам).

программный вызод некой обертки по имени CRecordset два раза подряд не обязательно приводит к созданию двух физически разных коннектов к базе
что потверждает ваше сообщение об ошибке
28 сен 11, 19:07    [11350860]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
Не приводит. Для всех упомянутых мною курсоров, или, если Вам так больше нравится, result set-ов, "коннект" к базе (назовём его hdbc) указывается явно и он один и тот же.
Если под "коннектом" вы подразумеваете что-то другое, то можете пояснить.

Малоизвестная программная обёртка CRecordset... ну можете мне поверить что она порождает курсор на заданном подключении к БД.
29 сен 11, 13:50    [11354972]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Не приводит. Для всех упомянутых мною курсоров, или, если Вам так больше нравится, result set-ов, "коннект" к базе (назовём его hdbc) указывается явно и он один и тот же.
Если под "коннектом" вы подразумеваете что-то другое, то можете пояснить.

Коннект для сервера - это тот канал, через который происходит обмен данными с клиентом
Номер этого коннекта вы можете увидеть через запрос select @@spid
А трассировка событий сервера вам покажет, происходит ли создание нового коннекта при той или другой команде вашего клиентского приложения

Ой Вэй
Малоизвестная программная обёртка CRecordset... ну можете мне поверить что она порождает курсор на заданном подключении к БД.

Я верю сообщению сервера
А оно говорит о том, что вы пытаетесь использовать один коннект для одновременного выполнения двух запросов
Насчет "заданного подключения" смотри выше про трассировку и номер коннекта
29 сен 11, 13:58    [11355041]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
Да, я использую один коннект для двух одновременных запросов. И вполне успешно. См. выше про MARS.

Я настаиваю на том, что проблема именно в особенностях выполнения каталожных функций.

Мне хотелось бы услышать ответ от кого-нибудь ещё.
29 сен 11, 14:06    [11355114]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ой Вэй,

дык услышьте же!
трассировка событий сервера вам покажет, происходит ли создание нового коннекта при той или другой команде вашего клиентского приложения
29 сен 11, 14:10    [11355174]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Я настаиваю на том, что проблема именно в особенностях выполнения каталожных функций.

Проблема в том, что коннект, который вы собрались использовать, занят выполнением другого запроса
Т.е. проблема в вашем коде. Как бы вам не хотелось утверждать обратное
29 сен 11, 14:16    [11355247]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
iljy,

я попробую. Пока не знаю как, но почитаю и узнаю.
Мне казалось, что кто-нибудь уже сталкивался с подобной проблемой и может дать ответ, а не посылать в гугль или прочий RTFM.
29 сен 11, 14:16    [11355252]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ой Вэй,

запускаете Profiler - и вперед.
29 сен 11, 14:19    [11355281]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Мне казалось, что кто-нибудь уже сталкивался с подобной проблемой и может дать ответ, а не посылать в гугль или прочий RTFM.

Прочитайте лучше ваши же предыдущие вопросы
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=189284&hl=
29 сен 11, 14:20    [11355289]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
От запуска профайлера хуже не стало (шутка).

Как в нём увидеть "происходит ли создание нового коннекта", я пока не понял. В нижнем правом углу всё время написано "Соединения: 1".

Вызовы каталожных функций и обычных SELECT-ов отличаются:
exec [sys].sp_columns_100 NULL,N'dbo',NULL,NULL,@fUsePattern=1
и
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int',N'SELECT 
<текст SELECT-а>
select @p1
соответственно.

(если включить трассировку большего числа событий, то у SELECT-а есть "PrepareSQL", а у SQLColumns() нету).

Для второго одновременного SELECT-а set @p1=2 и т.д.

Вызов, который ругается на "Подключение занято", не порождает записи в профайлере. Больше никаких записей во время выполнения нет. Те что есть относятся к EventClass "RPC:Completed".

Отсюда что-то следует? (на интересующую меня тему)
29 сен 11, 16:24    [11356619]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Вызов, который ругается на "Подключение занято", не порождает записи в профайлере.

Как он ее может породить, если серверу ничего не передается. Потому что соединение занято выполнением запроса

Отслеживать надо было события создания коннекта
29 сен 11, 16:28    [11356652]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
Не нашёл такого события. К какому классу событий оно относится?
MSSQL2008 32bit
29 сен 11, 16:46    [11356792]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Не нашёл такого события. К какому классу событий оно относится?

Audit Login
29 сен 11, 16:53    [11356854]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
В описываемое время ни одного Login или Logout не было.
29 сен 11, 17:16    [11357075]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Ой Вэй,

почитайте http://msdn.microsoft.com/ru-ru/library/ms345109(v=sql.90).aspx
может придет понимание что не все то золото что паралельно работает:)
29 сен 11, 17:23    [11357171]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Ой Вэй
Member

Откуда: Харьков
Сообщений: 581
WarAnt,

почитайте ещё какой-нибудь большой и красивый текст. Мне нужен ответ на поставленный мной вопрос. Я этот вопрос вежливо задал на специализированном форуме. Не знаете ответа — не кидайтесь ссылками на многобукафф.
29 сен 11, 17:30    [11357238]     Ответить | Цитировать Сообщить модератору
 Re: Почему "подключение занято..." (CRecordset + SQLColumns())?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ой Вэй
Мне нужен ответ на поставленный мной вопрос. Я этот вопрос вежливо задал на специализированном форуме. Не знаете ответа — не кидайтесь ссылками на многобукафф.

ответ только уже давно дан
29 сен 11, 18:06    [11357550]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить