Adodb vba recordset: Свойства, методы и события объекта Recordset — ActiveX Data Objects (ADO)
Содержание
Время ожидания запроса истекло Excel VBA Набор записей ADODB
спросил
Изменено
1 год, 7 месяцев назад
Просмотрено
692 раза
Я получаю сообщение об истечении времени ожидания запроса при запуске этого кода.
Я попытался установить ограничения времени ожидания для подключения, и время ожидания команды из запроса истекло при попытке запустить короткую процедуру, но безуспешно.
Вы можете увидеть мои комментарии в CAPS в коде для условий тайм-аута. В SSMS это выполняется примерно за 45 секунд. В моей книге есть несколько запросов, использующих одно и то же соединение. Это самый тяжелый запрос (возвращает около 7 тыс. строк), поэтому я почти уверен, что проблема заключается в тайм-ауте запроса, а не в соединении.
Подблоки() Application.ScreenUpdating = Ложь Dim rs4 как объект Установите rs4 = CreateObject("ADODB.Recordset") '04Unit2 Dim sqlstr04 как строка sqlstr04 = "выберите * из dbo.[04Units]" Лист17.Ячейки.Очистить Звонок connectDatabase rs4.Open sqlstr04, DBCONT DBCONT.commandtimeout = 120 'ТАЙМ-АУТ СОЕДИНЕНИЯ rs4.commandtimeout = 120 'ВРЕМЯ ЗАПРОСА RECORDSET 'Отладка. Печать sqlstrledger03 Для intColIndex = 0 Для rs4.Fields.Count - 1 Sheet17.Range("A1").Offset(0, intColIndex).Value = rs4.Fields(intColIndex).Имя Следующий Sheet17.Range("A2").CopyFromRecordset rs4 Конец сабвуфера
Ошибка
DBCont определен в отдельном модуле:
- excel
- vba
- тайм-аут
- ado
- набор записей
900 33
8
Метод Open
вашего набора записей уже инициирует выполнение SQL-команды. Ваши
TimeOut
-commands должны быть установлены до выполнения команды.
Просто измените порядок кода и установите время ожидания до вы выполняете команду SQL, которая должна помочь (я думаю, что объект набора записей не имеет метода тайм-аута)
DBCONT.commandtimeout = 120 'ВРЕМЯ ПОДКЛЮЧЕНИЯ rs4.Open sqlstr04, DBCONT
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
excel — VBA получает фактический первый столбец при использовании ADODB.Recordset
Задавать вопрос
спросил
Изменено
4 года, 3 месяца назад
Просмотрено
3к раз
У меня есть файл excel, который я запрашиваю со следующими заголовками столбцов:
JIRA #, имя отчета BO, местоположение отчета BO, дата завершения, попытки
При использовании приведенного ниже кода он возвращает столбец 5 (попытки) как первое поле. Я знаю, что это, скорее всего, потому, что заголовок столбца в алфавитном порядке начинается первым, но мой вопрос заключается в том, как сделать так, чтобы первая запись в наборе записей была первым столбцом, вторая запись в наборе записей — вторым столбцом и так далее?
Подпрограмма GetHeaders() 'добавить среду выполнения сценариев Microsoft в свою справочную библиотеку Dim ado As Object Dim instanceFile как объект FilePath = "Ваш путь к файлу" '''Изменить Установите ado = CreateObject("ADODB.Connection") Установить instanceFile = GetObject(FilePath) с трудом .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & FilePath & ";Extended Properties=""Excel 12.0; HDR=YES; IMEX=1""; Mode=Read;" С .OpenSchema (20) Dim таблица как строка Dim rs как объект Dim vFieldName как строка таблица = .Поля ("ИМЯ_ТАБЛИЦЫ") Установить rs = ado.OpenSchema(4, Array(Empty, Empty, table)) При ошибке Возобновить Далее rs.MoveFirst При ошибке Перейти к 0 Пока не rs.EOF Отладка.Печать rs!COLUMN_NAME rs.MoveNext Венд Конец с Конец с адо.Закрыть instanceFile.Close Установите instanceFile = Ничего Конец сабвуфера
- excel
- vba
Вы можете получить первый столбец SQL-запроса следующим образом:
dim rs As ADODB.Recordset ... ... ... идентификатор = rs.Fields (0)
ps Обратите внимание, как я использую Early Binding , ссылаясь на ADODB DLL. Это лучший метод, чем Late Binding , поскольку вы получаете intellisense.
1
Если вам нужно использовать OpenSchema
вместо прямого доступа к именам полей (именам столбцов) базовой таблицы, вы можете использовать поле «ORDINAL_POSITION». Это часть набора строк COLUMNS, который возвращается функцией 9.0037 ado.OpenSchema(4, Array(Empty, Empty, table))
Вот краткий пример использования «ORDINAL_POSITION» со словарем для сортировки имен полей. Замените все в исходном коде между On Error Resume Next
и первым End With
этим кодом:
rs.MoveFirst При ошибке Перейти к 0 Dim dictColumns как Scripting.Dictionary Dim i как целое число Установите dictColumns = Новый сценарий.Словарь Пока не rs.EOF dictColumns.Add rs.Fields("ORDINAL_POSITION").Value, rs.Fields("COLUMN_NAME").Value rs.MoveNext Венд Для i = 1 для dictColumns.Count Debug.Print dictColumns.Item(i) Далее я
Подробную информацию обо всех полях, возвращенных в наборе строк COLUMNS, можно найти здесь. Однако для Excel вполне вероятно, что некоторые из этих полей будут содержать NULL, поскольку они относятся к функциям, которые Excel не поддерживает
.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.