问题:在窗体的On Open事件上将ADODB.Recordset连接到RECORDSET窗体

问题描述 投票:0回答:2

我有一个“链接”到SQL数据库的访问项目,该项目现在像一个超级按钮一样工作。我解决的最后一个问题是,确保将任何布尔字段都转换为默认值为0的位,并且由于ACCESS并不是具有记录锁定功能的天才,所以在SQL中添加了TIMESTAMP(因此被告知)。

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

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

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

我想念什么吗?我是否需要为表单记录源分配任何内容?

此主意试图通过使用存储过程而不是链接表直接进行连接。非常感谢您的帮助。

forms ms-access unbound
2个回答
0
投票

由于SQL ACCESS不是具有记录锁定功能的天才,所以在SQL中添加了TIMESTAMP(因此被告知)

这不是一个好主意。 Access在重新获取记录以查看写入后是否有更改时不喜欢它,并且它也不完全是预期的方式(这就是为什么会发生写入冲突),但是TIMESTAMP字段总是在变化。

使用Access时避免使用TIMESTAMP字段,或手动处理更新而不是使用绑定控件来自己控制锁定/写入冲突。

您可以尝试通过从记录集中排除TIMESTAMP字段来欺骗Access,但是我认为您添加它的原因仍然无效,因为它肯定不会改善Access方面的任何功能。只要拥有PK,Access就可以了,并且避免使用在写入行或TIMESTAMP字段时更改行的触发器。

也请注意:如果您分配Form.Recordset属性,则它仍然是具有它带来的所有好处和问题的绑定形式。未绑定表单是您处理代码中所有内容的表单(添加新行,检查字段是否更改,处理导航/过滤器/排序,将更改提交到数据库等),而这显然不是您在做什么。未绑定的全功能表单需要大量工作,因此我几乎从不推荐它们。


0
投票

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

此问题与锁定有关。为何要添加此列的原因是因为Access将使用该列来确定记录何时变脏,并且更加重要地指出记录已更改。如果省略此列,则访问会逐列测试方法还原为一列。这不仅会导致更多的网络流量,而且由于四舍五入的关系,对于实型值更糟,您可能会疏通此记录已被其他用户更改。但是,它没有被更改,即使具有浮点值的列也将导致对该更改记录的错误输出。

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

所以是的,它很高,但是非常高,建议您在所有表中包括/添加一个行版本列-这将以极大的方式帮助Access。

并且如上所述,没有默认设置的位字段存在一个长期存在的问题。因此,您不想允许添加/创建具有空值的位字段。因此,请确保默认值为0(您设置此sql服务器端)。

好,现在我们已经清除了上面的内容吗?

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

因此,将表单直接绑定到链接表。然后,您可以启动/打开这样的表单:

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

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

然后将发票表格加载到ONE记录。那么,即使表单绑定(链接表)具有200万行?只有一个记录将来自网络管道。那么,存储过程中所有额外的工作,创建记录集并进行拉取呢?就性能而言,您将获得ZERO,但是您在不需要时将编写各种代码,并且与上一行代码相比,您无法实现任何优越的性能,这些代码将自动过滤并仅提取符合条件的记录。给定条件(在此示例中为发票编号)。

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

最后但并非最不重要?我看不到性能上的任何提高,甚至看不到尝试通过采用存储过程来编码自己的方式的优点,甚至看不到不需要的情况下引入reocrdset代码的优点,但是更糟的是,无论如何都不会提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.