хороший метод с использованием свойства Recordset, спасибо за подсказку!
Патрик, метод, который вы показали на своей странице, имеет большой недостаток (я тоже пробовал сам): список значений может быть только 32 КБ, если вы превысите этот предел, функция выдаст ошибку.
У метода обратного вызова есть большой недостаток: он очень медленный и вызывается один раз для каждой записи, что делает его непригодным для использования в длинном списке.
Использование метода набора записей работает очень хорошо. Мне это нужно, потому что моя строка SQL была длиннее 32 КБ (много значений индекса для WHERE ID IN (x, x, x, x, x ...)).
Вот простая функция, которая использует эту идею для установки набора записей в комбинированный список:
' Fills a combobox with the result of a recordset.
'
' Works with any length of recordset results (up to 10000 in ADP)
' Useful if strSQL is longer than 32767 characters
'
' Author: Christian Coppes
' Date: 16.09.2009
'
Public Sub fnADOComboboxSetRS(cmb As ComboBox, strSQL As String)
Dim rs As ADODB.Recordset
Dim lngCount As Long
On Error GoTo fnADOComboboxSetRS_Error
Set rs = fnADOSelectCommon(strSQL, adLockReadOnly, adOpenForwardOnly)
If Not rs Is Nothing Then
If Not (rs.EOF And rs.BOF) Then
Set cmb.Recordset = rs
' enforces the combobox to load completely
lngCount = cmb.ListCount
End If
End If
fnADOComboboxSetRS_Exit:
If Not rs Is Nothing Then
If rs.State = adStateOpen Then rs.Close
Set rs = Nothing
End If
Exit Sub
fnADOComboboxSetRS_Error:
Select Case Err
Case Else
fnErr "modODBC->fnADOComboboxSetRS", True
Resume fnADOComboboxSetRS_Exit
End Select
End Sub
(Функция fnADOSelectCommon открывает набор записей ADO и возвращает его. Функция fnErr показывает окно сообщения с ошибкой, если оно было.)
Поскольку эта функция закрывает открытый набор записей, проблем с памятью не должно быть. Я проверил это и не увидел увеличения памяти, которая не освобождалась после закрытия формы с помощью выпадающих списков.
В событии Unload формы вы можете дополнительно использовать «Set rs = Me.Comboboxname.Recordset» и затем закрыть его. Это не должно быть необходимо в отношении памяти, но может быть лучше освободить открытые соединения (если используется с внутренним сервером базы данных).
Приветствия
Christian