Chr*_*ell 15 sql ms-access linked-tables
我正在维护一个链接到MSSQL2000数据库的多用户Access 2000 DB,而不是我编写的.
数据库设计很差,所以你必须忍受我.
在"客户"表单上有一个"Customer_ID"字段,默认情况下需要获取下一个可用的客户ID,但用户可以选择使用现有客户ID覆盖此选项.
现在,Customer_ID字段不是Customer表的PK.它也不是唯一的.
如果客户拨打两次提交作业,该表将获得两条记录,每条记录具有相同的客户信息和相同的客户ID.
如果用户创建新票证,Access会快速查找下一个可用的客户ID并将其填入.但它不会保存记录.显然是一个问题 - 两个用户编辑必须跟踪彼此的工作,这样他们就不会欺骗客户ID.
所以我想修改"新记录"按钮,以便在创建新票据后立即保存票证.
问题是,当我测试更改时,我得到"此记录已被其他用户更改,因为您开始编辑它".
绝对没有DB上的其他用户."其他用户"可能是我被迫保存的.
有任何想法吗?
Ist*_*ari 44
看一下SQL Server 2000中的链表.它是否有一个包含bit数据类型的字段?如果您的位字段没有默认值, Access将在链接表方案中为您提供此错误消息.
它可能不是你的情况下的错误,但我在Access 2007数据库中遇到了相同的问题,并将问题跟踪到没有默认值的位字段.
您通常会遇到以下错误:
和
对Jet来说,这是两个"用户",因为它是两个不同的编辑操作.SQL更新已更新基础表,而表单缓冲区中的数据现已过期.
通常的解决方案是在运行SQL更新之前强制保存:
If Me.Dirty Then
Me.Dirty = False
End If
[run your SQL update here]
Run Code Online (Sandbox Code Playgroud)
但是如果您使用表单来编辑记录,则应该在表单中进行所有更新,而不是使用SQL来进行更新.
您描述的生成自己序列的情况应该以这种方式完成:
用户点击NEW RECORD按钮.
计算下一个序列值并将其存储在变量中.
通过SQL INSERT插入具有该序列值的新记录.
4A.如果您的表单绑定到表中的所有记录,请重新查询数据编辑表单(假设NEW RECORD按钮位于用户编辑数据的表单上),并使用书签导航移动到具有序列值的新记录您存储在步骤2中的变量中.
4B.如果您的表单没有绑定到所有记录(因为它不应该是一个设计良好的数据库),您只需更改表单的记录源以仅加载新记录.
另一种方法是避免SQL INSERT和重新查询(或重置记录源),只需在现有表单中添加新记录,将序列字段设置为新值并立即保存记录.
关键点是,为了使其在多用户环境中工作,必须在将序列值分配给记录时立即保存记录 - 您不能将记录挂在那里未保存,因为这意味着相同的序列值可供其他用户使用,这只是要求发生灾难.
这是一个老问题,我从谷歌那里得到了,所以我会提交我的答案.
在ODBC驱动程序中,确保打开行版本控制.如果该表已在Access中,则必须将其删除并重新链接到源表.
您应该能够判断是否启用了行版本控制,因为Access应该为您的表添加一个列xmin.
| 归档时间: |
|
| 查看次数: |
40024 次 |
| 最近记录: |