Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]疑难求解

cspa  发表于:2013-01-07 14:43:43  
复制

A、B、C三个通讯录。无论那个通讯录,   
    当记录数少于19(有时是18、17)或大于120时,点击“全选”(“取消”)复选框,工作正常。
   
    当记录数大于19(有时是18、17)但小于120时,点击“取消”复选框出现错误提示:

“运行时错误'3197'

由于您和其他用户试图同时改变同一数据,导致Microsoft Jet 数据库引擎停止进程。”

    求解这是为什么?

具体见附件。点击下载此附件

 

 

Top
dbaseIIIer 发表于:2013-01-07 16:41:51

原因很简单,有鬼”  


想看电视,就不要投诉那个剧情不合理; 用 Access 就要接受,他内里的处理能力。


闭上眼睛瞎猜,就是   你的数据表的 记录大小 刚好在 19, 120记录 左右 

是 Jet 数据引擎 处理你这个记录集 的一个 “内存页” 的 暂存区间临界点,也有可能在 220,320左右都是错误所在,

因为你的记录集 是用窗体的 recordset clone 出来的,意思就是 有个线程在同时在处理更新后的 内存处理当中,

交给Access继续处理下一个事务,但刚才那个事务因为要操作 “内存页”,还没来得及释放,你又来更新了!


虽然是另一条记录,但是还是在同一个记录区段(内存页),所以就变成同时更新了!


解决方法就是

Private Sub Check33_Click()
Dim RsCheckAll As DAO.Recordset    '建立全选数据集
Dim tgt As Boolean

On Error GoTo eeeee           '<--------------------添加这里
tgt = Me.Label34.Caption = "全选"
Set RsCheckAll = Me.Child1.Form.RecordsetClone
With RsCheckAll
    If .RecordCount > 0 Then
        .MoveFirst
        n = 0
        Do While Not .EOF

             g=0                          '<--------------------添加这里

            .Edit
            !check = tgt
            .Update
            .MoveNext
        Loop
    End If
End With
Me.Label34.Caption = IIf(tgt, "取消", "全选")

RsCheckAll.Close
Set RsCheckAll = Nothing
exit sub

eeeee:                                '<--------------------添加这三行
g = g + 1
If g < 3 Then Resume

End Sub

再尝试 Edit 多一次就OK了! 代码里试3次都不行就退出!


不好意思的,我看你的代码太笨所以改过了!见谅!



cspa 发表于:2013-01-07 17:04:20
非常感谢dbaseIIIer老总解决了我的问题,并帮我优化了代码。这个问题算不算Access的BUG呢?

dbaseIIIer 发表于:2013-01-08 03:34:28
算呀!绝对,绝对,绝对,绝对 是个 bug

总记录:3篇  页次:1/1 9 1 :