在表单的 On Open 事件中将 ADODB.Recordset 连接到表单 RECORDSET 时出现问题

Problem with connecting ADODB.Recordset to a forms RECORDSET on the On Open event of the form

我有一个 "linked" 到 SQL 数据库的访问项目,现在可以正常工作了。我解决的最后一个问题是,确保将任何布尔字段转换为默认值为 0 的位,并在 SQL 中添加 TIMESTAMP,因为 ACCESS 在记录锁定方面并不是一个天才(所以我被告知)。

现在我尝试通过使用 ADODB.Recordset 并将 forms.recordset 设置为记录集来直接连接到 SQL 服务器,在表单的 OnOpen 事件中,(此记录集在 SQL 中运行一个存储过程,我得到了很好的数据,但得到了错误锁定(写冲突)。

此 ADODB.Recordset cursorlocation 设置为 "adUseClient"。

显然,我不再将表单记录源附加或分配给链接的 SQL table。

我错过了什么吗?我需要向表单记录源分配任何内容吗?

The Idea 试图通过使用存储过程而不是链接 table 直接连接。 非常感谢您的帮助。

添加时间戳是一个非常好的主意。并且不要将 term/name 使用的时间戳混淆为实际的 date/time 列。正确的术语是 "row version".

此问题与锁定零相关。您想要添加此列的原因是因为 Access 将使用该列来确定记录何时变脏,更重要的是找出记录已被更改。如果省略此列,则访问将恢复为逐列测试方法。这不仅会导致更多的网络流量,而且对于实际类型值更糟,由于四舍五入,您可以挖掘出这条记录已被另一个用户更改。但是,它没有被更改,即使是具有浮点值的列也会导致访问错误,并显示已更改的记录。

因此,对于所有 tables,您甚至会看到 SSMA 中包含的选项(访问 sql 迁移向导表明此选项可用(我相信它是默认设置).

所以是的,它是高的,但非常高建议您 include/add 所有 table 的行版本列 - 这将以巨大的方式帮助访问。

如前所述,没有默认设置的位域存在一个长期存在的问题。因此,您不想让位字段 added/created 具有空值。因此,确保有一个默认值 0(你设置这个 sql 服务器端)。

好的,上面的内容都弄清楚了吗?

关于您为什么想要或需要或正在采用存储过程和代码来 load/fill 表单的原因并不是那么清楚。如果将表单直接绑定到链接的 table,您不会看到任何更好的性能。 Access 只会提取您告诉该表单加载的记录。

因此,将表单直接绑定到链接 table。然后,您可以 launch/open 表格说一次记录:

docmd.OpenForm "frmInvoices",,,"InvoiceNum = 123"

现在,您当然可以将上面的“123”更改为某个变量或某种方式来提示用户输入要处理的发票。

然后发票表格将加载到一条记录中。那么,即使表单绑定(链接 table)有 200 万行?只有一条记录会通过网络管道。那么,存储过程的所有额外工作,创建记录集并提取它?你将在性能方面获得零,但是你在根本不需要的时候编写各种代码,并且你没有获得比上面一行代码的任何优越性能,该代码将自动过滤并仅下拉满足条件的记录给定标准(在此示例中为发票编号)。

所以: 是的,所有 table 都需要 PK 是的,所有 tables 都应该有一个 rowversion(但它称为时间戳列 - 与实际时间无关)。 是的,所有位字段都需要默认值 0 - 不允许空值。

最后但同样重要的是? 我没有看到任何性能上的提升,甚至没有看到通过采用存储过程和在需要 none 时引入 reocrdset 代码来尝试编写代码的任何优势,但更糟糕的是无论如何也不会获得性能。