Runtime error 3704 операция не допускается если объект закрыт

Перейти к основному контенту

Перейти к основному контенту

Поддержка

Поддержка

Войти

Войти с помощью учетной записи Майкрософт

Войдите или создайте учетную запись.

Здравствуйте,

Select a different account.

У вас несколько учетных записей

Выберите учетную запись, с помощью которой вы хотите войти.

Проблемы

Ошибка 3704 не разрешается, когда объект закрыт «» queing Catalog Failed «(каталог) ошибки возникают при формировании отчета.

Причина

Поврежденный файл FRxque32. mdb.

Решение

Выйдите из сервера отчетов FRx. Удалите файл FRxque32. mdb, расположенный в каталоге Sysdata. Снова откройте сервер отчетов. Этот actionwill повторно создает файл FRxQue32. mdb на основе шаблона, который позволит вам отправлять отчеты в очередь без ошибок.

Ссылки

Facebook

LinkedIn

Электронная почта

Нужна дополнительная помощь?

Совершенствование навыков

Перейти к обучению >

Первоочередный доступ к новым возможностям

Присоединение к программе предварительной оценки Майкрософт >

Были ли сведения полезными?

(Чем больше вы сообщите нам, тем больше вероятность, что мы вам поможем.)

(Чем больше вы сообщите нам, тем больше вероятность, что мы вам поможем.)

Насколько вы удовлетворены качеством перевода?

Что повлияло на вашу оценку?


Моя проблема решена


Очистить инструкции


Понятно


Без профессиональной лексики


Полезные изображения


Качество перевода


Не соответствует интерфейсу


Неверные инструкции


Слишком техническая информация


Недостаточно информации


Недостаточно изображений


Качество перевода

Добавите что-нибудь? Это необязательно

Спасибо за ваш отзыв!

×

1 / 1 / 0

Регистрация: 29.04.2015

Сообщений: 88

1

03.12.2015, 09:14. Показов 9093. Ответов 9


Такая ситуация — происходит коннект к внешней базе через коннект отправляется sql запрос, объект rs =New ADODB.Recordset, затем, при методе «Do while not rs.EOF» возникает ошибка 3704, но если перед циклом поставить задержку в секунду то, запрос нормально пробегается, такое ощущение, что не хватает времени для открытия запроса. Но ставить задержку в секунду как-то накладно, если необходимо 1000 раз обращаться, то это уже 1000 секунд задержки просто так. Как можно победить данную ошибку?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт MS Access

7262 / 4465 / 287

Регистрация: 12.08.2011

Сообщений: 13,448

03.12.2015, 10:05

2

А если ошибку игнорировать, всё работает как надо?



0



1 / 1 / 0

Регистрация: 29.04.2015

Сообщений: 88

03.12.2015, 10:06

 [ТС]

3

да, но при этом нужно идти в Debug и продолжить выполнение, т.е. происходит задержка, я поставил перед циклом задержку на 0.6 секунд и вроде не вылетает, но это костыль какой-то получается



0



mobile

Эксперт MS Access

26772 / 14451 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

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



Модератор

Эксперт MS Access

11267 / 4597 / 740

Регистрация: 07.08.2010

Сообщений: 13,182

Записей в блоге: 4

03.12.2015, 10:20

5

не помешает вставить счетчик повторов, иначе можно зациклиться



0



Silmaril

1 / 1 / 0

Регистрация: 29.04.2015

Сообщений: 88

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

11267 / 4597 / 740

Регистрация: 07.08.2010

Сообщений: 13,182

Записей в блоге: 4

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



1 / 1 / 0

Регистрация: 29.04.2015

Сообщений: 88

03.12.2015, 10:59

 [ТС]

8

Спасибо! Точно! Нужная вещь о количестве повторов, т.к. я не задумался, что связи может не быть



0



шапоклякистка 8-го дня

3672 / 2232 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

03.12.2015, 11:00

9

Помнится, читала я в какой-то из рекомендованый mobile книг, что для отлавливания такой ситуации есть свойство .State у ADODB.Recordset — оно меняется, когда рекордсет уже открыт и готов к работе.

Честно говорю, что сама еще не пробовала (повода не было), просто отложилось в памяти.



1



1 / 1 / 0

Регистрация: 29.04.2015

Сообщений: 88

03.12.2015, 11:09

 [ТС]

10

Да, тоже имеет место быть, когда State = 1 то всё готово, но State в условии существенно увеличивает время обработки



0



Run-time error ‘3704’ Operation is not allowed when the object is closed.

To resolve the error, ensure the code you execute returns only data as a result, and not the intermediary “rows affected” messages. To achieve this, the following line to your stored procedure / code.

SET NOCOUNT ON;

Sample Error Message

Add “SET NOCOUNT ON;” to your stored procedure.

I have identified several blog posts where people experienced the same problem

Run-Time Error 3704 Operation Is Not Allowed The Object Is Closed

Setting NO COUNT ON in VBA ADODB

ADO error “3704” object is closed

The SQL Server OLEDB provider (SQLOLEDB) has a new behavior designed to provide more accurate information to the caller about what happened in the procedure. Each SQL statement within a stored procedure returns a “result,” either a count of rows affected, or a resultset.

The SQL Server ODBC provider (MSDASQL) does not provide information about the results of individual SQL statements within a stored procedure. The only result that comes back from a stored procedure execution is the result of the SELECT statement if it has one. This is why the problem does not manifest with MSDASQL.

To get SQLOLEDB to behave as the SQL ODBC driver did, you must use SET NOCOUNT ON. Put SET NOCOUNT ON in the stored procedure or in the SQL statement used with ADO as shown in the code sample below. Alternatively, you could use MSDASQL.

This behavior is by design.

The problem is described here:

Published by john.dacosta

I am a Database Consultant based in South Florida. I specialize in SQL Server Development and Administration. I have worked on projects including data archival, log shipping, SQL Server installation, performance tuning, database mirroring, disaster recovery and more recently data integration. Currently my role as a consultant has had me add focus to the particularly important subject of Documentation, Quality, Timeliness and Cross-Training within the realm of Technology Delivery.
View all posts by john.dacosta

Published
2017-10-13

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Runtime error 3704 vba
  • Runtime error 91 solidworks
  • Runtime error 3051
  • Runtime error 3633
  • Runtime error 91 object variable or with block variable not set что значит

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии