【发布时间】:2019-10-18 06:33:03
【问题描述】:
当我尝试在 MS Access 子表单中使用 DoCmd.GotoRecord 移动到下一条记录时,出现错误 2105。
在.accdb 文件中,有一个MainForm,一个Subform 和一个Module,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
创建一个 SubForm,创建一个 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 行时得到Error 2105 cannot go to specified record
为什么?
如果您将所有代码都放在 Subform 中,它可以正常工作,所以我认为没有理由仅仅因为 SubForm 是“在子窗体控件中”而不能正常工作。
如果您对如何在子表单的记录集中前后移动光标有任何其他想法,我会很高兴听到的。但是表单记录集是 ADO 非常重要。
【问题讨论】:
-
代码对我有用。但我没有使用 SQLServer 后端。我也从未使用过 Recordset 属性。
-
是的,如果您使用 .accdb 后端(或 DAO),它可以正常工作。我在迁移到 SQL Server 时遇到了这个问题
-
我使用记录集是因为我不知道让 SQL Server 执行查询的其他方法(出于性能原因,查询在现实世界中非常复杂),这也是我迁移至全部。
-
您可以使用在服务器端执行的
passthrough查询。 -
你检查过两个表单的加载事件的顺序了吗?