Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Silmaril
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 87
#1

Ошибка 3704 - Операция не допускается, если объект закрыт

03.12.2015, 09:14. Просмотров 1639. Ответов 9
Метки нет (Все метки)

Такая ситуация - происходит коннект к внешней базе через коннект отправляется sql запрос, объект rs =New ADODB.Recordset, затем, при методе "Do while not rs.EOF" возникает ошибка 3704, но если перед циклом поставить задержку в секунду то, запрос нормально пробегается, такое ощущение, что не хватает времени для открытия запроса. Но ставить задержку в секунду как-то накладно, если необходимо 1000 раз обращаться, то это уже 1000 секунд задержки просто так. Как можно победить данную ошибку?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2015, 09:14
Ответы с готовыми решениями:

Ошибка авторизации "Операция не допускается, если объект открыт"
В бд хранятся пользователи и пароли.Для авторизации в приложении использую код...

"Операция не допускается если объект открыт", БД
При компиляции в билдере или при запуске .exe выводит ошибку При следующей...

Ошибка при навигации по DataSet: объект закрыт
У меня БД подключается, как нажимаю вывести таблицу БД он выводит такую ошибку...

Операция не допускается в данном контексте
В данной статье http://www.delphikingdom.com/asp/viewitem.asp?catalogid=408 ...

Почему закрыт объект RecordSource?
мне нуижно запросом выбрать некоторые значения из таблиц, потом каждое из этих...

9
alvk
Эксперт MS Access
5574 / 3470 / 168
Регистрация: 12.08.2011
Сообщений: 8,828
03.12.2015, 10:05 #2
А если ошибку игнорировать, всё работает как надо?
0
Silmaril
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 87
03.12.2015, 10:06  [ТС] #3
да, но при этом нужно идти в Debug и продолжить выполнение, т.е. происходит задержка, я поставил перед циклом задержку на 0.6 секунд и вроде не вылетает, но это костыль какой-то получается
0
mobile
Эксперт MS Access
22847 / 12945 / 2663
Регистрация: 28.04.2012
Сообщений: 14,177
03.12.2015, 10:08 #4
Попробуйте использовать DoEvents
Visual Basic
1
2
3
4
5
6
On error resume next
nextp:
x=rs(0)
if err<>0 Then DoEvents: goto nextp 'Если ошибка, то еще попытка обратиться к данным
on error goto 0                     'Ошибки нет, входим в обычную работу
Do while not rs.EOF
1
shanemac51
Модератор
Эксперт MS Access
7800 / 3016 / 429
Регистрация: 07.08.2010
Сообщений: 8,206
Записей в блоге: 1
03.12.2015, 10:20 #5
не помешает вставить счетчик повторов, иначе можно зациклиться
0
Silmaril
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 87
03.12.2015, 10:43  [ТС] #6
Спасибо! Получается, но немного изменил:

Visual Basic
1
2
3
4
5
6
7
8
9
On error resume next
nextp:
x=rs(0)
if (err<>0) and (err<>3021) Then ' добавил обход ошибки 3021, т.е. если в запросе нет записей по данному фильтру, хотя непонятно почему тогда такие в запрос попадают, и тоже происходит зацикливание
Err=0 ' иначе значение ошибки не обнуляется и идёт зацикливание
DoEvents: goto nextp 'Если ошибка, то еще попытка обратиться к данным
Endif
on error goto 0                     'Ошибки нет, входим в обычную работу
Do while not rs.EOF
0
shanemac51
Модератор
Эксперт MS Access
7800 / 3016 / 429
Регистрация: 07.08.2010
Сообщений: 8,206
Записей в блоге: 1
03.12.2015, 10:54 #7
Лучший ответ Сообщение было отмечено Silmaril как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
On error resume next
kcycle=0
nextp:
x=rs(0)
if (err<>0) and (err<>3021) Then ' добавил обход ошибки 3021, т.е. если в запросе нет записей по данному фильтру, 
kcycle=kcycle+1
 
if kcycle>10 then
''''''''''''''''''''''''''
msgbox "что делать --нет связи"
exit sub
endif
 
 
хотя непонятно почему тогда такие в запрос попадают, и тоже происходит зацикливание
Err=0 ' иначе значение ошибки не обнуляется и идёт зацикливание
DoEvents: goto nextp 'Если ошибка, то еще попытка обратиться к данным
Endif
on error goto 0                     'Ошибки нет, входим в обычную работу
Do while not rs.EOF
1
Silmaril
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 87
03.12.2015, 10:59  [ТС] #8
Спасибо! Точно! Нужная вещь о количестве повторов, т.к. я не задумался, что связи может не быть
0
texnik-san
шапоклякистка 8-го дня
3630 / 2191 / 389
Регистрация: 26.06.2015
Сообщений: 4,648
Записей в блоге: 1
03.12.2015, 11:00 #9
Помнится, читала я в какой-то из рекомендованый mobile книг, что для отлавливания такой ситуации есть свойство .State у ADODB.Recordset - оно меняется, когда рекордсет уже открыт и готов к работе.

Честно говорю, что сама еще не пробовала (повода не было), просто отложилось в памяти.
1
Silmaril
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 87
03.12.2015, 11:09  [ТС] #10
Да, тоже имеет место быть, когда State = 1 то всё готово, но State в условии существенно увеличивает время обработки
0
03.12.2015, 11:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2015, 11:09

Если указанный байт выше 1F или 31, тогда закрыт форму
если указанный байт выше 1F или 31 тогда закрыт форму искал не нашел может...

Ошибка в XML: не допускается употребление элемента в этом контексте
Доброго всем дня! Есть схема &lt;?xml version=&quot;1.0&quot;?&gt; &lt;xs:schema...

Если объект добавлять в 2 контейнера, то в них будет ссылка или новый объект?
Есть объект - obj. Последовательно добавляю его в два контейнера ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru