Recordset.Find错误:行集不支持使用存储过程向后滚动

时间:2019-04-29 08:23:06

标签: sql-server excel vba stored-procedures adodb

我正在尝试使用Find在记录集中查找值,因为似乎不支持Seek,但是我无法克服错误

  

行集不支持向后滚动

根据this SO thread,我必须指定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 :(得分:0)

我测试了您的代码,并可能重现该错误。对我来说,它是通过添加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

答案 1 :(得分:0)

问题不在于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

我在this vbforums thread上找到了解决方案。我注意到OP就像我一样使用存储过程,所以出现此错误代码可能是由于该因素。

我对ADODB记录集的了解有限,因此,如果有人愿意解释为什么将cursorlocation设置为adUseClient可以解决我的问题,请成为我的客人。