如何在DAO数据库中正确使用Seek

时间:2016-03-01 13:30:52

标签: vba ms-access access-vba dao

我正在尝试在我的桌子上的列表框控件中搜索当前选定的项目。

在更新事件后的列表框控件中,我有这段代码

Private Sub lst_MainList_AfterUpdate()
    Dim theDB As DAO.Database
    Dim theProposalsTable As DAO.Recordset

    Set theDB = CurrentDb
    Set theProposalsTable = theDB.OpenRecordset("tbl_PROPOSAL", dbOpenDynaset)

    theSeeker theProposalsTable, Me.lst_PPpg_MainList.Value    
End Sub

然后我的Module1上有一个子代码。我从示例代码@ https://msdn.microsoft.com/en-us/library/office/ff836416.aspx

中得到了这个
Sub theSeeker(ByRef rstTemp As Recordset, intSeek As Integer)

   Dim theBookmark As Variant
   Dim theMessage As String

   With rstTemp
      ' Store current record location.
      theBookmark = .Bookmark
      .Seek "=", intSeek

      ' If Seek method fails, notify user and return to the
      ' last current record.
      If .NoMatch Then
         theMessage = "Not found! Returning to current record." & vbCr & vbCr & "NoMatch = " & .NoMatch
         MsgBox theMessage
         .Bookmark = theBookmark
      End If
   End With
End Sub

我收到运行时错误3251此类对象不支持操作。

当我点击Debug时,会突出显示.Seek "=", intSeek

2 个答案:

答案 0 :(得分:3)

这一点来自链接页面......

  

在索引表类型Recordset对象

中查找记录

... " table-type Recordset" 表示您必须使用dbOpenTable代替dbOpenDynaset OpenRecordset()

这一点至关重要。如果您无法使用dbOpenTable打开表格,则无法使用SeekdbOpenTable只能与当前数据库中包含的本机Access表一起使用。它不能与任何类型的链接表一起使用。

因此,如果dbOpenTabletbl_PROPOSAL兼容,则此更改将消除第一个错误...

'Set theProposalsTable = theDB.OpenRecordset("tbl_PROPOSAL", dbOpenDynaset)
Set theProposalsTable = theDB.OpenRecordset("tbl_PROPOSAL", dbOpenTable)

如果确实有效,则下一个错误将是#3019,"没有当前索引时操作无效。" 这是因为您必须在调用{之前设置控制索引{1}} ...

Seek

如果需要列出表索引的名称,可以检查其With rstTemp ' Store current record location. theBookmark = .Bookmark ' Set the index. .Index = "PrimaryKey" '<- use your index name here .Seek "=", intSeek 集合。这是一个立即窗口示例,在我的数据库中有一个表...

TableDef.Indexes

答案 1 :(得分:0)

您不能在链接表上使用 Seek 方法,因为您不能将链接表作为表类型 Recordset 对象打开...

但是,如果您使用 OpenDatabase 方法打开后端数据库,则可以使用 Seek 方法。

所以代替:

Set theDB = CurrentDb()

这样做:

Set theDB = OpenDatabase("full path to backend database")
Set theProposalsTable = theDB.OpenRecordset("tbl_PROPOSAL", dbOpenTable)