Ошибка "Объект был открыт" с использованием Delphi, SQL Server и ADO
Я получаю сообщение об ошибке "Объект был открыт" при открытии TADOQuery, который возвращает большой набор данных (около 700 000 строк и 75 столбцов).
8 из моих полей являются производными полями как varchar(200), и я обнаружил, что ошибка не возникает, если я изменяю их на varchar(95) или меньше, или varchar(256) или больше, то есть ошибка возникает только в диапазон 96-255. Ошибка также не возникает, если я удаляю эти столбцы из своего запроса или выбираю меньше строк.
Гуглинг предположил, что это известная ошибка с SQLOLEDB с полями nvarchar больше 127, но это не так для меня. Я использую SQLOLEDB, но вместо этого я попытался перейти на собственный клиент SQL Server, и ошибка по-прежнему возникает.
Может кто-нибудь пролить свет на это, я в тупике. Я использую Delphi 5 и SQL Server 2008R2, и запрос выбирает данные во временную таблицу, а затем выбирает из временной таблицы, вот так (примечание, это упрощенная версия фактического запроса, который использует 75 столбцов и 8 таблиц):
select memno, surname, forename,
'EE Conts in Year'= CAST('' as varchar(200)),
'ER Conts in Year'= CAST('' as varchar(200)),
'AVC Conts in Year'= CAST('' AS VARCHAR(200)),
'ERAVC Conts in Year'= CAST('' AS VARCHAR(200)),
'Total EE Conts'= CAST('' AS VARCHAR(200)),
'Total ER Conts'= CAST('' AS VARCHAR(200)),
'Total AVC Conts'= CAST('' AS VARCHAR(200)),
'Total ERAVC Conts'= CAST('' AS VARCHAR(200)),
into #tmptab
from members
select * from #tmptab
order by surname
Спасибо
1 ответ
Я получал ту же ошибку, и некоторые изменения в моих свойствах TAdoQuery исправили ее. Моя ситуация несколько отличается от вашей, поэтому я опишу ее, прежде чем перейти к изменениям, которые сработали для меня.
У меня довольно большой стол; 684 673 строки, 107 столбцов и размер данных 636240 КБ. В нем три набора повторяющихся столбцов, которые я собираюсь нормализовать для трех новых таблиц. Запрос?
SELECT * FROM MyTable
Так что это просто прямой проход по столу, только в одном направлении. Обработка не нуждается в каком-либо конкретном заказе, поэтому добавление индексов, помимо первичного ключа, не поможет. Поскольку я не делаю никаких изменений в этой таблице, это предложение только для чтения. Ничего не нужно отображать.
Я получал сообщение об ошибке в Delphi IDE, когда просто пытался установить для свойства TADOQuery.Active этой таблицы значение true. Другими словами, просто попытка открыть его в IDE выкинула ошибку. Нет смысла проверять какой-либо мой код, прежде чем я смогу успешно открыть его в IDE.
Я внес следующие изменения в TADOQuery этой таблицы:
CommandTimeout: 600
CursorLocation: clUseServer
CursorType: ctOpenForwardOnly
EnableBCD: False
LockType: ltReadOnly
Ошибка больше не происходит ни в IDE, ни в моем коде обработки.
Может быть, только одно из этих изменений было необходимо. Если да, то я не знаю, потому что я не проверял их по одному. Я просто внес все изменения, которые выглядели как кандидаты, чтобы дать запросу лучший шанс на успех.
Просто измените запрос YourADOQuery
(если применимо) перед установкой для свойства Active значения true, как показано ниже:
YourADOQuery.SQL.Text := 'select top 100 * from ' + YourADOQuery.SQL.Text + ')a';
Обратите внимание, что 100
НЕ "100 ПРОЦЕНТОВ"! но возвращает 100 процентов записей:)