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

    Зарегистрируйтесь, используя адрес электронной почты и пароль

    Опубликовать как гость

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

    Требуется, но не отображается

    Опубликовать как гость

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

    Требуется, но не отображается

    Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.