Ошибка Recordset.Find: Rowset не поддерживает прокрутку назад с помощью хранимой процедуры - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь найти значения в моем наборе записей с помощью Find, так как Seek, похоже, не поддерживается, но не могу устранить ошибку

Rowset не поддерживает прокруткуbackward

Согласно этой SO-нити , я должен указать adOpenDynamic, но это не изменило код ошибки.

Я использую хранимую процедуру (sp_fkeys), которая возвращает все ключи для всех таблиц, и в этом случае для одной таблицы, поскольку я указываю имя таблицы.

Private Sub maintablebox_Change()

Dim cnn As ADODB.Connection
Dim keys As ADODB.Recordset
Set cnn = New ADODB.Connection
connstring = "omitted"
cnn.Open connstring

Set keys = New ADODB.Recordset
keys.CursorLocation = adUseServer
query = "EXEC sp_fkeys @fktable_name = 'astAssets'"
keys.Open query, connstring, adOpenDynamic, adLockReadOnly

' >>>>>Error on the line below
keys.Find "PKTABLE_NAME = 'astAssetTypes'"

Debug.Print keys.Fields("FKCOLUMN_NAME")
End Sub

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Проблема заключается не в операторе keys.CursorType, а в операторе keys.CursorLocation.

Я заменил keys.CursorLocation = adUseServer на keys.CursorLocation = adUseClient, что немедленно решило проблему.

Рабочий код стал

Private Sub maintablebox_Change()

Dim cnn As ADODB.Connection
Dim keys As ADODB.Recordset
Set cnn = New ADODB.Connection
connstring = "omitted"
cnn.Open connstring

Set keys = New ADODB.Recordset
keys.CursorLocation = adUseClient
query = "EXEC sp_fkeys @fktable_name = 'astAssets'"
keys.Open query, connstring, adOpenDynamic, adLockReadOnly

keys.Find "PKTABLE_NAME = 'astAssetTypes'"

Debug.Print keys.Fields("FKCOLUMN_NAME")
End Sub

Я нашел решение на этой ветке vbforums .Я заметил, что OP использует хранимую процедуру точно так же, как и я, поэтому код ошибки, который мне был представлен, может быть связан с этим фактором.

У меня ограниченные знания о наборах записей ADODB, поэтому, если кто-то захочет объяснить, почему установка курсора на adUseClient устранила мою проблему, пожалуйста, будьте моим гостем.

0 голосов
/ 29 апреля 2019

Я проверил ваш код и смог воспроизвести ошибку. Для меня это было решено добавлением moveFirst.

Private Sub maintablebox_Change()

Dim cnn As ADODB.Connection
Dim keys As ADODB.Recordset
Set cnn = New ADODB.Connection
Set keys = New ADODB.Recordset

cnn.Open DBPORT

Set keys.ActiveConnection = cnn
keys.CursorType = adOpenStatic

keys.Open "Select city_name, afas_rel_number, city_code from pkn_cities where has_month_report = true order by city_name ASC;"

keys.MoveFirst 'this did the trick for me
keys.Find "city_code = '1366'"
Debug.Print keys.Fields("city_name")

End Sub
...