我有一个访问项目,该项目“链接”到一个SQL数据库,该数据库现在工作起来很有魅力。我解决的最后一个问题是,确保将所有布尔字段转换为缺省值为0的位,并在SQL中添加时间戳,因为访问并不是记录锁定的天才(因此有人告诉我)。
既然我试图通过使用ADODB.Recordset并将forms.recordset设置为记录集直接连接到server,则在窗体的OnOpen事件中(此记录集在OnOpen中运行存储过程),我可以很好地获得数据,但返回错误锁定(写冲突)。
此ADODB.Recordset指针被设置为"adUseClient“。
显然,我不再将表单记录源附加或分配给链接的SQL表。
我是不是遗漏了什么?是否需要向表单记录源分配任何内容?
这个想法是试图通过使用存储过程而不是链接表来直接连接。非常感谢你的帮助。
发布于 2020-05-20 19:30:18
增加时间戳是一个非常好的主意。不要混淆使用时间戳表示实际日期/时间列的术语/名称。正确的术语是“行版本”。
此问题与锁定无关。您希望添加此列的原因是,Access将使用该列来确定记录何时是脏的,并且更重要的是知道记录已被更改。如果省略此列,则access将恢复到一列一列的测试方法。这不仅会导致更多的网络流量,而且更糟糕的是,对于实际类型的值,由于舍入,您可以得到疏浚,此记录已被另一个用户更改。但是,它没有被更改,即使是带有浮点值的列也会导致访问错误,从而使更改的记录出错。
因此,对于所有表,您甚至可以看到SSMA中包含的选项(访问sql迁移向导,该选项是可用的(我相信这是默认的)。
因此,是的,它很高,但建议您在所有表中包括/添加一个行版本列--这将极大地帮助访问。
如前所述,位字段没有默认设置的问题由来已久。因此,您不希望使用空值添加/创建位字段。因此,请确保默认值为0(您设置了这个sql服务器端)。
好了,现在我们已经把上面的东西弄清楚了吗?
对于您为什么需要、需要或正在采用存储过程和代码来加载/填充表单,这一点并不十分清楚。如果直接将表单绑定到链接表,则没有看到任何更好的性能。Access只会拉出您让该表单加载的重记录。
因此,直接将表单绑定到链接表。然后,您可以使用以下方法启动/打开表单(例如,对一次重试):
docmd.OpenForm "frmInvoices",,,"InvoiceNum = 123"现在,您当然会将上面的"123“更改为某种变量,或者以某种方式提示用户使用什么发票。
然后,发票表单将加载到一个记录中。那么,即使表单绑定(链接表)有200万行?只有一张唱片会从网络管道里传下来。那么,存储过程中的所有额外工作,创建一个记录集并将其拉出?您将获得零的性能,但您正在编写所有类型的代码时,它根本不需要,而且您没有达到任何优越的性能,以上一行代码将自动过滤,并只拉下记录,符合给定的标准(在本例中发票号码)。
所以:是的,所有的表都需要一个PK是的,所有的表都应该有一个行版本(但它称为时间戳列-与实际时间无关)。是的,所有位字段都需要默认的0-不允许空值。
最后但并非最不重要?我看不出性能上有任何提高,甚至没有任何好处试图通过采用存储过程来编写代码,以及在不需要任何代码的情况下引入重新设置代码,但更糟糕的是,无论如何也不会提高性能。
https://stackoverflow.com/questions/61917232
复制相似问题