Ошибка "Несоответствие типов" в ADODB.Recordset

У меня есть программа, которая должна читать данные из базы данных SQL и отправлять отчеты в Excel. Он работает должным образом на 32-битной машине, но, поскольку я перешел на 64-битную рабочую среду, программа не запустилась. Вот образец моего кода (первая ошибка вернулась):

Private Sub SearchBox_Change()
ResultBox.Clear

Call CompileQuery

'If the query is empty
If SearchBox.Value = "" Then
    NumShowingLabel = "Showing 0 of 0 Results"
    ResultBox.Clear
    GoTo noSearch
End If

'Open a new query with varQuery
With varRecordset
    .ActiveConnection = varConnection
    .Open varQuery
End With

'Set NumShowingLabel
If varRecordset.RecordCount > varMaxResults Then
    NumShowingLabel = "Showing 60 of " & varRecordset.RecordCount & " Results"
Else
    NumShowingLabel = "Showing " & varRecordset.RecordCount & " of " & varRecordset.RecordCount & " Results"
End If

'As long as there is a record, move to the first one
If Not varRecordset.RecordCount = 0 Then varRecordset.MoveFirst

'Add each record to ResultBox
If varRecordset.RecordCount > varMaxResults Then
    For varTempInt = 1 To varMaxResults
        ResultBox.AddItem varRecordset.Fields("FileName").Value
        varRecordset.MoveNext
    Next
Else
    For varTempInt = 1 To varRecordset.RecordCount
        ResultBox.AddItem varRecordset.Fields("FileName").Value
        varRecordset.MoveNext
    Next
End If

'Release varRecordSet
varRecordset.Close

noSearch:

End Sub

При запуске Excel возвращает ошибку «Несоответствие типов» и выделяет .RecordCount из For varTempInt = 1 To varRecordset.RecordCount (последний цикл for в примере). Я установил исправление, рекомендованное статьей поддержки Windows 983246, по крайней мере, насколько я понимаю. Я установил его в каталог C: и перезапустил компьютер, но он по-прежнему не работает.

Изменить 1: просто хотел уточнить, что ранее я использовал ADO 2.5, а не ADO 6.1

TL; DR: Как я могу исправить ошибку RecordSet.RecordCount «Несоответствие типов» на 64-разрядной машине с Excel 2010?


person jaysoncopes    schedule 25.02.2015    source источник
comment
Какой тип курсора использует ваш varConnection? Я считаю, что вам нужно adOpenKeyset или adOpenStatic, чтобы получить точный .RecordCount с ADO. По умолчанию adOpenForwardOnly недостаточно для этой цели.   -  person    schedule 25.02.2015
comment
@Jeeped Я использую adUseClient (3). Я видел это где-то в Интернете, но если adOpenKeyset или adOpenStatic было бы лучше, я бы хотел попробовать.   -  person jaysoncopes    schedule 02.03.2015


Ответы (6)


У меня не было этой конкретной проблемы, но я обнаружил, что свойство recordcount в наборе записей ADODB работает или отсутствует. Лучше всего переписать циклы следующим образом:

recordset.movefirst 
While Not recordset.eof
    <your stuff with your record>
    recordset.movenext
Loop

Кроме того, чтобы проверить наличие записей в вашем наборе записей, вы можете использовать:

If recordset.BOF and recordset.EOF THEN
     <Something is wrong there are no records>
End If

Я предполагаю, что свойство recordcount ADODB, вероятно, является дерьмом с 64-битной версией любого используемого вами драйвера ODBC, как и почти в каждом драйвере ODBC.

person JNevill    schedule 25.02.2015
comment
Спасибо за быстрый ответ! Мне не нравится, что мне придется работать над особенностями ADO 2.5, но если ADO 6.0 не сработает, это будет абсолютно допустимый вариант (я только что протестировал его). - person jaysoncopes; 26.02.2015

эта проблема фактически вызвана ошибкой в ​​более ранних версиях Excel. есть исправление. HotFix

Я разрабатываю некоторые макросы в офисе 16, но когда я использую UAT в предыдущих версиях, он терпит неудачу, быстрое простое решение для этого - просто привести RecordCount

rst = SomeRecordset
dim rstCount as Long
rstCount = CLng(rst.RecordCount)
person dfresh22    schedule 29.09.2017
comment
Спасибо, исправлен мой код VBA в Excel, Word и Access после обновления Office 32 = ›64 из-за Visio ... В самом деле, я думаю, что это следует отметить как ответ. - person Marcelo Scofano Diniz; 20.06.2019
comment
Прошло некоторое время с тех пор, как я смотрел на это, но я рад, что он смог вам помочь. Ваше здоровье - person dfresh22; 20.06.2019

Спасибо, ребята, за ваши быстрые ответы, однако мне каким-то образом удалось прийти к мысли об использовании ADO 6.1 вместо ADO 2.5. Похоже, что использование более современной версии объектов базы данных ActiveX помогло, да.

Для справки в будущем, если вы собираетесь перейти на ADO 6.0, значение ConnectionString будет таким же, ЗА ИСКЛЮЧЕНИЕМ вы должны использовать User ID=<USR>; Password=<PSWD> вместо USR=<USR>;PWD=<PWD>

person jaysoncopes    schedule 25.02.2015
comment
Спас мой бекон. Ваше здоровье! Обновление с 2.8 до 6.1 позволило мне правильно назначить длинную переменную RecordCount свойству rs.RecordCount. - person Jay Killeen; 07.06.2016

Я меняю его с as Long на as LongLong. Затем мой VBA начинает работать. Исправление не требуется ...

person Jonson Tsai    schedule 17.07.2018

Просто проверьте версию Excel. ADO хорошо работает с 32-разрядной версией и возникают проблемы с 64-разрядной версией.

person Ashwin    schedule 07.06.2018

У нас была эта ошибка из-за того же типа сравнения и мы использовали тот же ответ, что и от dfresh22 и Jonson Tsai. Спасибо, ребята!
Единственная разница для нас заключалась в том, что ошибка возникла в 64-битном Office, а у нас все еще есть несколько пользователей в 32-битном Office, поэтому было проще преобразовать в меньшую 32-битную переменную, а не в большую. в большую 64-битную переменную. Поскольку переменная, которую мы сравнивали с RecordCount, всегда будет меньше 100 (и определенно всегда <32K), я смог просто преобразовать из Long в Integer в 64-битной версии, а 32-битный код просто преобразовал из Integer в Integer:

ЕСЛИ intNumRecs> CInt (DBreports.RecordCount) ТО ...

person Bobznkazoo    schedule 20.05.2019