0

我有一个“链接”到 SQL 数据库的访问项目,现在它就像一个魅力。我解决的最后一个问题是,确保将所有布尔字段转换为默认值为 0 的位,并在 SQL 中添加 TIMESTAMP,因为 ACCESS 并不是记录锁定的天才(有人告诉我)。

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

此 ADODB.Recordset 光标位置设置为“adUseClient”。

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

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

这个想法试图通过使用存储过程而不是链接表来直接连接。非常感谢您的帮助。

4

1 回答 1

0

添加时间戳是一个非常好的主意。并且不要将使用时间戳的术语/名称混淆为实际的日期/时间列。正确的术语是“行版本”。

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

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

所以是的,它是 HIGH 但非常强烈建议您在所有表中包含/添加 rowversion 列 - 这将极大地帮助 Access。

如前所述,没有默认设置的位字段存在一个长期存在的问题。因此,您不想允许使用空值添加/创建位字段。所以,确保有一个默认值 0(你设置这个 sql server 端)。

好的,既然我们已经清除了上述内容?

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

因此,将表单直接绑定到链接表。然后,您可以使用以下命令启动/打开一次 reocrd 的表单:

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

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

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

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

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

于 2020-05-20T19:30:18.163 回答