我正在尝试使用Find
在我的记录集中查找值,因为似乎不支持Seek
,但我无法克服错误
行集不支持向后滚动
根据这个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
问题不在于keys.CursorType
语句,而在于keys.CursorLocation
语句。
我用keys.CursorLocation = adUseClient
替换了keys.CursorLocation = adUseServer
,这立即解决了问题。
工作代码已成为
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 解决了我的问题,请成为我的客人。
我测试了您的代码,可以重现错误。对我来说,这是通过添加 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