我正在尝试使用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
答案 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可以解决我的问题,请成为我的客人。