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

После добавление временной таблицы и левого соединения к Основному запросу (много строк) начала выскакивать ошибка, указанная в заголовке.

Как-то не понятно почему, до этого использовал временные таблицы не было такого …

    
    // само левое соединение

    |    — Отобрать Outcome

    |    LEFT JOIN #MasterTransactionIdForOutcome        AS TraOt ON TraOt.MasterTransactionId    = Operations.MasterTransactionId

    |    — СОСТАВИТЬ СПИСОК MasterTransactionId С Outcome

    |    IF OBJECT_ID(‘tempdb..MasterTransactionIdForOutcome’) IS NOT NULL DROP TABLE #MasterTransactionIdForOutcome

    |    SELECT DISTINCT TraT.MasterTransactionId

    |    INTO     #MasterTransactionIdForOutcome

    |    FROM ski2db2017.dbo.MasterTransaction         AS Operations

    |        LEFT JOIN ski2db2017.dbo.TransactionDetail AS Tra ON Tra.MasterTransactionId = Operations.MasterTransactionId

    |                AND Tra.SuperAccountIdFrom = 2 AND Tra.SuperAccountIdTo IS NULL

    |            LEFT JOIN ski2db2017.dbo.TransactionDetail AS TraT ON TraT.MasterTransactionId = Tra.MasterTransactionId

    |                    AND TraT.SuperAccountIdFrom <> 2 AND TraT.SuperAccountIdFrom IS NOT NULL

    |                    AND TraT.SuperAccountIdTo = 2

    |    WHERE TraT.MasterTransactionId IS NOT NULL  —Operations.TransTime BETWEEN ‘20170202’ AND ‘20170203’

RecordSet = Новый COMОбъект(«ADODB.RecordSet»);

    RecordSet.Open(ТекстЗапроса, Connection);

    
    //перейдём в начало списка

    Если Не RecordSet.EOF Тогда

        RecordSet.MoveFirst();

    КонецЕсли;

    
    
    Попытка

        // для каждой полученной записи        

        Пока Не RecordSet.EOF Цикл     // ТУТ ОШИБКА ВЫЛЕТАТ ОБ Операция не допускается, если объект закрыт.

            ОбработкаПрерыванияПользователя();

            НоваяСтрока = ТаблицаРезультат.Добавить();

            
            // заполняем строку        

            Для каждого Колонка из ЭлементыФормы.ТаблицаРезультат.Колонки Цикл

                ОбработкаПрерыванияПользователя();

                ИмяКолонки = Колонка.Имя;

                Если ИмяКолонки = «НомерСтроки» ИЛИ ИмяКолонки = «ДатаБезВремени» Тогда

                     Продолжить;

                КонецЕсли;        

                
                Значение = RecordSet.Fields.Item(ИмяКолонки).Value;

                Если значение <> Null Тогда

                    НоваяСтрока[ИмяКолонки] = СокрЛП(Значение);

                    Если Найти(ИмяКолонки, «Id») Тогда

                        НоваяСтрока[ИмяКолонки] = СтрЗаменить(НоваяСтрока[ИмяКолонки], » «, «»);

                    КонецЕсли;                                    

                КонецЕсли;            

            КонецЦикла;        

            // переходим к сл. строке        

            RecordSet.MoveNext();        

        КонецЦикла;

    Исключение

        //Предупреждение(«База Скибарс занята. Повторите попытку подключения позже.»);

        Сообщить(ОписаниеОшибки());

    КонецПопытки;

    ЭтаФорма.Заголовок = «Количество строк: » + ТаблицаРезультат.Количество()

        + «, времени затрачено: » + (ТекущаяДата() — ДатаНачалаДляВремени) + » секунд»;

This function inserts a row into a SQL database and needs to return the identity number created:

Function WriteDatabase(backupTypeID, numImages, folderSize, success, errorMessage, strLogFileName)

    On Error Resume Next
    err.clear
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    objConnection.Open "Provider=SQLOLEDB;Data Source=x.x.x.x;Initial Catalog=DB;User ID=sa;Password=xxxxxx"
    sqlquery = "INSERT INTO tblImageCopies (BackupCopyDate, BackupCopyTypeID, NumImages, ImagesFolderSize, Success, ErrorMessage) VALUES (GETDATE(), " & backupTypeID & ", " & numImages & ", " & folderSize & ", " & success & ", " & errorMessage & "); SELECT scope_identity() AS ImageCopyID;" 
    objRecordSet.Open sqlquery,objConnection
    objRecordSet.MoveFirst
    WriteDatabase = objRecordSet("ImageCopyID")
    objRecordSet.Close
    objConnection.Close
    If err.number <> 0 Then
        WriteLog "Error writing to the EHN database - " & err.number & " " & err.description, strLogFileName
    End If

End Function

It successfully inserts the row, but I get the error message ‘3704 Operation is not allowed when the object is closed.’ when it tries to return the identity number in the record set. When I execute this sql query directly on the server, it works. Anyone able to help?

1 / 1 / 0

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

Сообщений: 88

1

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


Студворк — интернет-сервис помощи студентам

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



0



Эксперт MS Access

7336 / 4476 / 289

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

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

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

26784 / 14463 / 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

11400 / 4710 / 759

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

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

Записей в блоге: 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

11400 / 4710 / 759

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

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

Записей в блоге: 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-го дня

3675 / 2235 / 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



Номер телефона пуст

Чаще всего эта ситуация встречается, при работе с файлом Excel. В вопросах и ответах есть объяснения причин этого:

  • Почему некоторые номера телефонов в программе пустые, хотя в документе Excel они заполнены?
  • Почему программа звонит по отсутствующим номерам в пустых ячейках Excel?

Ещё одной причиной может быть неправильно выбранное поле базы данных (столбец) с номером телефона на странице выбора полей с данными.

Невозможно записать сделанные изменения, поскольку введенное значение противоречит параметрам, заданным для этой таблицы или списка

Скорее всего, в качестве источника данных используется документ Excel. Подобные ошибки возникают в том случае, когда используются объединённые ячейки в таблице.

Возникла ошибка в записи результатов звонка

Запрос для записи в базу данных результатов работы не может быть выполнен. Возможно, вы выбрали другой источник данных на странице записи результатов или, если используется собственный SQL-запрос, сделали в нём ошибку. В первом случае достаточно указать правильные поля для записи, во втором обязательно проверьте, работает ли запрос при нажатии на кнопку «Проверить».

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

Источник данных, из которого необходимо получить или в который надо записать данные в настоящий момент недоступен. Проверьте возможность подключения к источнику данных. Возможно, он используется каким-то приложением, в том числе запущенной или некорректно закрытой копией Call Office. Во втором случае нужно завершить в диспетчере процессов все процессы mshta.exe.

Ошибка загрузки страницы. Разрешение отклонено

Проверьте, есть ли у вас доступ к базе данных. Если есть, то ваши операционные системы конфликтуют друг с другом, такое встречается, например, при попытке Windows XP получить доступ к базе данных в более старшей версии Windows. Установите ODBC-драйвер доступа к этой базе данных или перенесите базу данных на локальный компьютер, где установлен Call Office.

BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись

Вероятно, что ошибка возникла после того, как была удалена запись из базы данных, с которой программа собиралась работать. Если ошибка возникает и пользователь не изменял поля в базе данных, то сформируйте журнал и отправьте его разработчикам для дальнейшего изучения и выявления ошибки.

Ошибка получения данных для обзвона

После запуска сценария программа пытается получить данные с номерами телефонов, суммами задолженностей и так далее. Если данные не могут быть получены, возникает эта ошибка. Попробуйте заново указать источник данных и выбрать необходимые для работы сценария поля. Возможно, была изменена структура таблицы или базы данных, с которой вы работаете. Например, удалён лист из файла Excel, переименованы названия колонок и так далее.

Отсутствует значение для одного или нескольких требуемых параметров

Ошибка может возникать в связи с тем, что формат столбца в базе является числовым, а данные для записи имеют текстовый формат. Попробуйте изменить форматы столбцов для записи на текстовый или числовой. Столбец с датой должен иметь формат даты.

Объект не найден ядром базы данных

Ошибка может возникать из-за неправильного указания имени таблицы в выбранной базе данных. Проверьте корректность указанной таблицы.

Потеряна связь с Microsoft Excel для просмотра присоединенных листов

Такая ошибка чаще всего возникает, если вы открыли документ Excel, затем запустили Call Office использующий этот же документ и после этого закрыли документ Excel. В этом случае ODBC-драйвер для работы с документами Excel теряет связь с открытым документом и возникает эта ошибка.
Мы рекомендуем не открывать документ Excel перед работой Call Office.

В процессе записи результата возникла ошибка: недопустимое имя

Такая ошибка возникает при вызове SQL-запроса, когда имя таблицы указана не верно или указана с ошибкой. Проверьте корректность имени таблицы.

Недостаточно системных ресурсов, при выполнении SQL запроса

CallOffice является 32-х битным приложением, и имеет ограниченный размер динамически выделяемой памяти в 2 GB. Данная ошибка возникает при достигнутом ограничении. Чаще всего это происходит при обзвоне в несколько циклов, с большой базой номеров. В таком случае мы рекомендуем установить в настройках количество циклов 1, а запуск в несколько циклов осуществлять с помощью bat файла

После добавление временной таблицы и левого соединения к Основному запросу (много строк) начала выскакивать ошибка, указанная в заголовке.

Как-то не понятно почему, до этого использовал временные таблицы не было такого …

    

    // само левое соединение

    |    — Отобрать Outcome

    |    LEFT JOIN #MasterTransactionIdForOutcome        AS TraOt ON TraOt.MasterTransactionId    = Operations.MasterTransactionId

    |    — СОСТАВИТЬ СПИСОК MasterTransactionId С Outcome

    |    IF OBJECT_ID(‘tempdb..MasterTransactionIdForOutcome’) IS NOT NULL DROP TABLE #MasterTransactionIdForOutcome

    |    SELECT DISTINCT TraT.MasterTransactionId

    |    INTO     #MasterTransactionIdForOutcome

    |    FROM ski2db2017.dbo.MasterTransaction         AS Operations

    |        LEFT JOIN ski2db2017.dbo.TransactionDetail AS Tra ON Tra.MasterTransactionId = Operations.MasterTransactionId

    |                AND Tra.SuperAccountIdFrom = 2 AND Tra.SuperAccountIdTo IS NULL

    |            LEFT JOIN ski2db2017.dbo.TransactionDetail AS TraT ON TraT.MasterTransactionId = Tra.MasterTransactionId

    |                    AND TraT.SuperAccountIdFrom <> 2 AND TraT.SuperAccountIdFrom IS NOT NULL

    |                    AND TraT.SuperAccountIdTo = 2

    |    WHERE TraT.MasterTransactionId IS NOT NULL  —Operations.TransTime BETWEEN ‘20170202’ AND ‘20170203’

RecordSet = Новый COMОбъект(«ADODB.RecordSet»);

    RecordSet.Open(ТекстЗапроса, Connection);

    

    //перейдём в начало списка

    Если Не RecordSet.EOF Тогда

        RecordSet.MoveFirst();

    КонецЕсли;

    

    
    Попытка

        // для каждой полученной записи        

        Пока Не RecordSet.EOF Цикл     // ТУТ ОШИБКА ВЫЛЕТАТ ОБ Операция не допускается, если объект закрыт.

            ОбработкаПрерыванияПользователя();

            НоваяСтрока = ТаблицаРезультат.Добавить();

            

            // заполняем строку        

            Для каждого Колонка из ЭлементыФормы.ТаблицаРезультат.Колонки Цикл

                ОбработкаПрерыванияПользователя();

                ИмяКолонки = Колонка.Имя;

                Если ИмяКолонки = «НомерСтроки» ИЛИ ИмяКолонки = «ДатаБезВремени» Тогда

                     Продолжить;

                КонецЕсли;        

                

                Значение = RecordSet.Fields.Item(ИмяКолонки).Value;

                Если значение <> Null Тогда

                    НоваяСтрока[ИмяКолонки] = СокрЛП(Значение);

                    Если Найти(ИмяКолонки, «Id») Тогда

                        НоваяСтрока[ИмяКолонки] = СтрЗаменить(НоваяСтрока[ИмяКолонки], » «, «»);

                    КонецЕсли;                                    

                КонецЕсли;            

            КонецЦикла;        

            // переходим к сл. строке        

            RecordSet.MoveNext();        

        КонецЦикла;

    Исключение

        //Предупреждение(«База Скибарс занята. Повторите попытку подключения позже.»);

        Сообщить(ОписаниеОшибки());

    КонецПопытки;

    ЭтаФорма.Заголовок = «Количество строк: » + ТаблицаРезультат.Количество()

        + «, времени затрачено: » + (ТекущаяДата() — ДатаНачалаДляВремени) + » секунд»;

Номер телефона пуст

Чаще всего эта ситуация встречается, при работе с файлом Excel. В вопросах и ответах есть объяснения причин этого:

  • Почему некоторые номера телефонов в программе пустые, хотя в документе Excel они заполнены?
  • Почему программа звонит по отсутствующим номерам в пустых ячейках Excel?

Ещё одной причиной может быть неправильно выбранное поле базы данных (столбец) с номером телефона на странице выбора полей с данными.

Невозможно записать сделанные изменения, поскольку введенное значение противоречит параметрам, заданным для этой таблицы или списка

Скорее всего, в качестве источника данных используется документ Excel. Подобные ошибки возникают в том случае, когда используются объединённые ячейки в таблице.

Возникла ошибка в записи результатов звонка

Запрос для записи в базу данных результатов работы не может быть выполнен. Возможно, вы выбрали другой источник данных на странице записи результатов или, если используется собственный SQL-запрос, сделали в нём ошибку. В первом случае достаточно указать правильные поля для записи, во втором обязательно проверьте, работает ли запрос при нажатии на кнопку «Проверить».

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

Источник данных, из которого необходимо получить или в который надо записать данные в настоящий момент недоступен. Проверьте возможность подключения к источнику данных. Возможно, он используется каким-то приложением, в том числе запущенной или некорректно закрытой копией Call Office. Во втором случае нужно завершить в диспетчере процессов все процессы mshta.exe.

Ошибка загрузки страницы. Разрешение отклонено

Проверьте, есть ли у вас доступ к базе данных. Если есть, то ваши операционные системы конфликтуют друг с другом, такое встречается, например, при попытке Windows XP получить доступ к базе данных в более старшей версии Windows. Установите ODBC-драйвер доступа к этой базе данных или перенесите базу данных на локальный компьютер, где установлен Call Office.

BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись

Вероятно, что ошибка возникла после того, как была удалена запись из базы данных, с которой программа собиралась работать. Если ошибка возникает и пользователь не изменял поля в базе данных, то сформируйте журнал и отправьте его разработчикам для дальнейшего изучения и выявления ошибки.

Ошибка получения данных для обзвона

После запуска сценария программа пытается получить данные с номерами телефонов, суммами задолженностей и так далее. Если данные не могут быть получены, возникает эта ошибка. Попробуйте заново указать источник данных и выбрать необходимые для работы сценария поля. Возможно, была изменена структура таблицы или базы данных, с которой вы работаете. Например, удалён лист из файла Excel, переименованы названия колонок и так далее.

Отсутствует значение для одного или нескольких требуемых параметров

Ошибка может возникать в связи с тем, что формат столбца в базе является числовым, а данные для записи имеют текстовый формат. Попробуйте изменить форматы столбцов для записи на текстовый или числовой. Столбец с датой должен иметь формат даты.

Объект не найден ядром базы данных

Ошибка может возникать из-за неправильного указания имени таблицы в выбранной базе данных. Проверьте корректность указанной таблицы.

Потеряна связь с Microsoft Excel для просмотра присоединенных листов

Такая ошибка чаще всего возникает, если вы открыли документ Excel, затем запустили Call Office использующий этот же документ и после этого закрыли документ Excel. В этом случае ODBC-драйвер для работы с документами Excel теряет связь с открытым документом и возникает эта ошибка.
Мы рекомендуем не открывать документ Excel перед работой Call Office.

В процессе записи результата возникла ошибка: недопустимое имя

Такая ошибка возникает при вызове SQL-запроса, когда имя таблицы указана не верно или указана с ошибкой. Проверьте корректность имени таблицы.

Недостаточно системных ресурсов, при выполнении SQL запроса

CallOffice является 32-х битным приложением, и имеет ограниченный размер динамически выделяемой памяти в 2 GB. Данная ошибка возникает при достигнутом ограничении. Чаще всего это происходит при обзвоне в несколько циклов, с большой базой номеров. В таком случае мы рекомендуем установить в настройках количество циклов 1, а запуск в несколько циклов осуществлять с помощью bat файла

1 / 1 / 0

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

Сообщений: 88

1

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


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

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

0

Эксперт MS Access

7262 / 4465 / 287

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

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

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

26771 / 14450 / 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

11261 / 4592 / 739

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

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

Записей в блоге: 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

11261 / 4592 / 739

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

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

Записей в блоге: 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

 

naz

Пользователь

Сообщений: 38
Регистрация: 01.01.1970

#1

01.03.2016 13:41:16

Доброго первого дня  весны, уважаемые.
Прошу подсказать, как одолеть такую ошибку:
есть стандартный доступ к таблице MS SQL из Excel’я:

Код
Option Explicit
Public Conn As New ADODB.Connection
Public Cmd As ADODB.Command
Public RecSet As New ADODB.Recordset
...
Conn.ConnectionString = "PROVIDER=SQLOLEDB; SERVER=MKS; DATABASE=devel; TRUSTED_CONNECTION=NO; UID=user; PWD=password"
Conn.ConnectionTimeout = 3600
Conn.CommandTimeout = 3600
Conn.Open
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandTimeout = 3600
Dim stroka As String
stroka = "MyProcedure"
Cmd.CommandText = stroka
Set RecSet = Cmd.Execute()
Range("A4").CopyFromRecordset RecSet
Set RecSet = Nothing
Set Cmd = Nothing
Set Conn = Nothing

, который нормально работает, если хранимая процедура «MyProcedure» возвращает набор строк быстро.
А стоит ей задуматься, то Excel (2010) радостно сообщает:
Error
ADODB.Recordset—>Операция не   допускается, если объект закрыт.
Тайм- ауты я всякие пробовал, не помогло..

 

Doober

Пользователь

Сообщений: 2131
Регистрация: 09.04.2013

Оптимизируйте процедуру  или получайте результат частями.

 

naz

Пользователь

Сообщений: 38
Регистрация: 01.01.1970

Тяжеловата процедура.. Хочется что- нить в объектах

Connection

,

Command

и

Recordset

подкрутить.. Почему

Recordset

закрытым оказывается?

Изменено: naz01.03.2016 16:38:17

 

Doober

Пользователь

Сообщений: 2131
Регистрация: 09.04.2013

#4

01.03.2016 15:00:36

Цитата
naz написал: Почему Recordset закрытым оказывается?

Время отработки процедуры очень большое.
Похожую проблему я решил дробление результата на части.Общее время выполнения процедур у меня составило 4 минуты.
Раньше выполнялась минут 12.Записей 4 млн строк,вытягивалась сводная таблица

<#0>

 

naz

Пользователь

Сообщений: 38
Регистрация: 01.01.1970

#5

01.03.2016 16:22:46

Похоже, дело не во времени выполнения процедуры, а в том, что в ней используется insert. Вот фрагмент процедуры:

Код
...
create table #StBudj
 (
     nrec  binary(8)     not null, 
     path  varchar(max)  not null, 
     name  varchar(max)  not null, 
     level int           not null, 
     scode varchar(max)  not null,
 );
insert into #StBudj(nrec, path, name, level, scode) select 0x11, 'path', 'name', 11;  -- На эту строку ошибка выдаётся
select * from #stbudj;

Если insert не использовать, ошибки нет.. Выполняется быстро.

Изменено: naz01.03.2016 16:23:37

 

Doober

Пользователь

Сообщений: 2131
Регистрация: 09.04.2013

Ошибки исправляете?
Небось такая ошибка
Список выбора для инструкции INSERT содержит меньшее число элементов,
чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.

 

naz

Пользователь

Сообщений: 38
Регистрация: 01.01.1970

#7

02.03.2016 06:09:50

Цитата
Doober написал:
Список выбора для инструкции INSERT содержит меньшее число элементов,
чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.

Нет, такой уже нет ошибки. Пробую разные варианты, может хранимку в функцию переделаю..

 

naz

Пользователь

Сообщений: 38
Регистрация: 01.01.1970

#8

02.03.2016 11:28:42

Вообщем так решил проблему. Может, кому пригодится.
Поскольку хранимая процедура скоропостижно закрывалась, не успев вернуть записи, заставил её записывать результат в специально сделанную таблицу (шлюз). Это делается первым вызовом recordset. А вторым вызовом вычёрпываем записи из «шлюза» в замечательный Excel.

Код
stroka = "MyProcedure"
Cmd.CommandText = stroka
Set RecSet = Cmd.Execute()

stroka = "select * from Table order by scode;"
Cmd.CommandText = stroka
Set RecSet = Cmd.Execute()
If RecSet.State <> adStateClosed Then
    Range("A3").CopyFromRecordset RecSet
    Else: MsgBox "RecSet закрыт. Это плохо.." & vbCrLf
End If

This function inserts a row into a SQL database and needs to return the identity number created:

Function WriteDatabase(backupTypeID, numImages, folderSize, success, errorMessage, strLogFileName)

    On Error Resume Next
    err.clear
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    objConnection.Open "Provider=SQLOLEDB;Data Source=x.x.x.x;Initial Catalog=DB;User ID=sa;Password=xxxxxx"
    sqlquery = "INSERT INTO tblImageCopies (BackupCopyDate, BackupCopyTypeID, NumImages, ImagesFolderSize, Success, ErrorMessage) VALUES (GETDATE(), " & backupTypeID & ", " & numImages & ", " & folderSize & ", " & success & ", " & errorMessage & "); SELECT scope_identity() AS ImageCopyID;" 
    objRecordSet.Open sqlquery,objConnection
    objRecordSet.MoveFirst
    WriteDatabase = objRecordSet("ImageCopyID")
    objRecordSet.Close
    objConnection.Close
    If err.number <> 0 Then
        WriteLog "Error writing to the EHN database - " & err.number & " " & err.description, strLogFileName
    End If

End Function

It successfully inserts the row, but I get the error message ‘3704 Operation is not allowed when the object is closed.’ when it tries to return the identity number in the record set. When I execute this sql query directly on the server, it works. Anyone able to help?

This function inserts a row into a SQL database and needs to return the identity number created:

Function WriteDatabase(backupTypeID, numImages, folderSize, success, errorMessage, strLogFileName)

    On Error Resume Next
    err.clear
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    objConnection.Open "Provider=SQLOLEDB;Data Source=x.x.x.x;Initial Catalog=DB;User ID=sa;Password=xxxxxx"
    sqlquery = "INSERT INTO tblImageCopies (BackupCopyDate, BackupCopyTypeID, NumImages, ImagesFolderSize, Success, ErrorMessage) VALUES (GETDATE(), " & backupTypeID & ", " & numImages & ", " & folderSize & ", " & success & ", " & errorMessage & "); SELECT scope_identity() AS ImageCopyID;" 
    objRecordSet.Open sqlquery,objConnection
    objRecordSet.MoveFirst
    WriteDatabase = objRecordSet("ImageCopyID")
    objRecordSet.Close
    objConnection.Close
    If err.number <> 0 Then
        WriteLog "Error writing to the EHN database - " & err.number & " " & err.description, strLogFileName
    End If

End Function

It successfully inserts the row, but I get the error message ‘3704 Operation is not allowed when the object is closed.’ when it tries to return the identity number in the record set. When I execute this sql query directly on the server, it works. Anyone able to help?

I hope you can help me on this. I’m getting an error Operation is not allowed when the object is closed when trying to execute the Insert into query but working in Select. I’m using vb.net btw (Microsoft Visual Studio 2010).

I open my database in module using this statement:

On Error GoTo Connprob

        DARHS_Connect = False

        conEmail = New ADODB.Connection
        conEmail.ConnectionString = "Provider=SQLOLEDB;Driver={SQL Server Native Client 10.0};Server=" + Server + ";Database=DatabaseName;Uid=" & User& ";Pwd=" & Password & ";"
        conEmail.Open()

        DARHS_Connect = True
Exit Function

and then here’s the code that works with no errors:

rsX = New ADODB.Recordset
        EmQuery = "SELECT * FROM TABLE_NAME WHERE COLUMN1 = '" & Recipient & "' AND COLUMN2 = '1'"
        rsX.Open(EmQuery, conEmail, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)

        If Not rsX.EOF Then
            Do While Not rsX.EOF

                EmQuery = "INSERT INTO TABLE(COLUMN1,COLUMN2,COLUMN3,COLUMN4) VALUES"
                EmQuery = EmQuery & "('" & RQuote(rsX.Fields.Item("EMAIL").Value) & "',"
                EmQuery = EmQuery & "'" & Message & "',"
                EmQuery = EmQuery & "'" & ServerDate & "'"
                EmQuery = EmQuery & "'PCO')"
                conEmail.Execute(EmQuery)

                rsX.MoveNext()
            Loop

        End If

And here’s the code that gives me the error:

EmQuery = "INSERT INTO TABLE_NAME(COLUMN1,COLUMN2,COLUMN3,COLUMN4) VALUES"
        EmQuery = EmQuery & "('" & Recipient & "',"
        EmQuery = EmQuery & "'" & Message & "',"
        EmQuery = EmQuery & "'" & ServerDate & "',"
        EmQuery = EmQuery & "'PCO')"
        conEmail.Execute(EmQuery)

Hope you guys can help me since this is a blocker on my project.
Thanks in advance!

  • Ошибка операционная система мешает созданию файла pcsx2
  • Ошибка операция не была успешно завершена так как файл содержит вирус или потенциально нежелательную
  • Ошибка оплаты вк комбо
  • Ошибка операции функцию не поддерживает hikvision
  • Ошибка операционной системы код 2 не удается найти указанный файл