当我尝试通过在MS Access子窗体中使用DoCmd.GotoRecord移至下一条记录时收到错误2105。
。accdb文件中,有一个带有子窗体和模块的MainForm,在SQL Server中有一个简单的表。就这样。
我认为我已尽可能简化了这个问题,如果您想帮助我,可以按照以下三个简单步骤操作:
在SQL Server中:
创建表格并填充一些数据(使用SSMS):
CREATE TABLE ATable (AColumn INT)
INSERT INTO ATable VALUES (6)
INSERT INTO ATable VALUES (126)
INSERT INTO ATable VALUES (210)
INSERT INTO ATable VALUES (11)
在MS Access 2016中
创建一个模块并在其中只写一行:
Public SQLDB As Object
[创建子表单,创建一个OnLoad事件并在其模块中编写此代码:
Dim rsa As Object
Private Sub Form_Load()
Set rsa = CreateObject("ADODB.Recordset")
End Sub
Public Sub Fill(ByVal sql As String)
rsa.Open sql, SQLDB
Set Me.Recordset = rsa
DoCmd.GoToRecord , , acNext
End Sub
最后,创建一个MainForm,在其上放置一个子窗体控件并绑定到SubForm,创建一个OnLoad事件,并将此代码写入其模块中(当然,您必须将连接字符串更改为您的环境):
Private Sub Form_Load()
Set SQLDB = CreateObject("ADODB.Connection")
SQLDB.Open "Driver={SQL Server Native Client 11.0};Server=YourSQLServer;Database=Yourdatabase;Trusted_Connection=yes;"
SQLDB.CursorLocation = 3 ' adUseClient
Me.UO.Form.Fill "ATable"
End Sub
当您打开MainForm时,您会在执行DoCmd.GotoRecord,,acNext
行时得到错误2105无法转到指定记录
为什么?
[如果您将所有代码都放在Subform中,效果很好,那么我就没有理由仅仅因为SubForm在“子窗体控件中”而不能工作。
如果您还有其他想法如何在子窗体的记录集中前后移动光标,我会很高兴听到。但是,表单记录集是ADO非常重要。
当我尝试通过在MS Access子窗体中使用DoCmd.GotoRecord移至下一条记录时,收到错误2105。在.accdb文件中,有一个带有子窗体和模块的MainForm,并且有一个简单的表...
我找到了原因。这是因为SubForm控件未在MainForm上处于活动状态(或“集中”)。因此解决方案是在Subform的代码中添加一行: