【问题标题】:VFP networking issues with Windows 10 1803Windows 10 1803 的 VFP 网络问题
【发布时间】:2026-02-19 03:45:01
【问题描述】:

我们在 Windows 1803 版本和 VFP9 SP2 上遇到了多用户网络文件共享的一些大问题。以下是我们看到的一些问题:

  1. 写入数据库的空白记录。系统会写入一个完整的记录,所有字段都有值,但该记录在表中是空白的。

  2. 已写入但在表格关闭之前不会显示给其他用户的记录。如果会话 A 打开一个表并添加 5 条记录,会话 B 将看到额外的 5 条记录在那里,但它们要么是空白的,要么看起来有来自先前记录的数据。会话 A 关闭表后,将显示其他会话的数据。

  3. 记录将被附加到表中,最终只会创建先前记录的副本。

这些似乎都是缓存或某种延迟写入的问题。

在过去的几天里,我在几十个安装中非常一致地看到了这些问题的各种组合。唯一的解决方案是让用户回滚到以前的 Windows 版本。

我们已尝试在客户端和服务器计算机上禁用 oplocks 并验证未启用脱机文件,但尚未找到解决方案。

有没有其他人见过类似的东西?建议?如果我们不弄清楚,这可能是一场灾难。

【问题讨论】:

  • 您查看过 SET REFRESH 命令吗?
  • 您在使用 ODBC (ODBC32) 吗?

标签: visual-foxpro


【解决方案1】:

这就是我们发现的。这些问题似乎是由 Windows 1803 的 KB4103721 更新引起的。我们能够通过删除该更新作为临时解决方案来解决问题。

我们现在通过禁用一些 SMB 缓存参数发现了这一点。

打开一个 powershell 管理提示符。 (右键单击开始按钮)

执行以下两条命令:

set-smbclientconfiguration -DirectoryCacheLifetime 0
set-smbclientconfiguration -FileInfoCacheLifetime 0

然后你可以运行

get-smbclientconfiguration

验证是否设置了值。

【讨论】:

    【解决方案2】:

    我通过锁定表解决了这个问题,如果无法锁定表,则等待表可用锁定。有时它会减慢进程,但数据不会丢失。代码在这里

    t2 = [INSERT INTO table (fields_list_here) VALUES (fields_value_here)]
    IF FLOCK()  && RLOCK
        &t2
        UNLOCK
    ELSE
        do while .t.
            IF not FLOCK()  &&RLOCK()
                WAIT WINDOW "Attempting to lock. Please wait ..." NOWAIT
                IF INKEY() = 27 && The loop may be too fast you may not escape. Try putting a parameter "inkey(.1)"
                    WAIT WINDOW "Aborting lock operation." NOWAIT
                    exit
                ENDIF
            ELSE
                &t2
                UNLOCK
                EXIT 
            ENDIF
        ENDDO
    ENDIF
    

    【讨论】:

    • 在每次写入后发出“FLUSH FORCE”似乎也有帮助,但我们能够使用下面的 smb 客户端配置解决它,而无需对我们的代码进行大量编辑。