【问题标题】:ODBC access over network to *.mdb通过网络对 *.mdb 进行 ODBC 访问
【发布时间】:2015-08-15 10:42:52
【问题描述】:

我有一个关于 *.mdb 的 ODBC 如何工作的一般性问题。

据我了解,如果我错了,请纠正我,无论我是否使用 odbc,当访问存储在另一台计算机(即 NAS)上的 MS Access 数据库(*.mdb)时,我的计算机首先需要加载完整的 *.mdb 文件,然后才能对其进行任何操作,无论它们多么简单。与只将结果发送回查询的 SQL 服务器非常不同。

如果您可以确认这一点,那么我有一些关于通过 odbc 访问 mdb 的多用户环境的相关问题:

  • 多久将文件保存回存储(即 NAS)?是否有某种“空闲”超时或类似的?我正在尝试找出较大文件生成的网络流量。
  • 一位用户可以多快看到另一位用户对同一文件所做的更改?
  • 这种文件访问如何在多用户环境中工作而不会不断导致数据损坏?

请注意,我确实知道更好和更有效的解决方案,我真的只是对这种特定情况的内部运作感兴趣。

谢谢

【问题讨论】:

    标签: ms-access networking odbc nas


    【解决方案1】:

    据我了解,如果我错了,请纠正我,无论我是否使用 odbc,当访问存储在另一台计算机(即 NAS)上的 MS Access 数据库(*.mdb)时,我的计算机首先需要加载完整的 *.mdb 文件,然后才能对其进行任何操作,无论它们多么简单。

    你错了。当数据库打开时,整个 .mdb(或 .accdb)文件将不会通过网络拉出。如果可以使用索引来识别相关行,即使对特定表的操作也不一定会通过网络拉取整个表。对于使用 Wireshark 执行的实际测量,请参阅我的回答 here

    文件多久保存回存储(即 NAS)?是否有某种“空闲”超时或类似的?我正在尝试找出较大文件所产生的网络流量。

    Access 数据库引擎可能会在提交更新之前将更新缓冲几秒钟。这样做可能是为了减少对数据库文件的争用。提交更新时,Access 数据库引擎仅通过网络将修改后的页面发回;它不会重写整个表(或文件)。

    一个用户可以多快看到另一个用户对同一文件所做的更改?

    我不久前进行了一些测试,发现一个用户(连接)所做的更改通常在大约五 (5) 秒后可用于其他连接。详情见我的回答here

    这种文件访问如何在多用户环境中工作而不会不断导致数据损坏?

    每个用户都有自己的 Access 数据库引擎实例来操作共享数据库文件,但各种实例相互协作以管理记录/页面锁定。请注意,当以“共享模式”打开 Access 数据库文件(.accdb 或 .mdb)时,会在同一文件夹中创建一个锁定文件(.laccdb 或 .ldb)。 Access 数据库引擎的各种实例都使用此锁定文件来管理多用户访问。

    示例:网络流量

    我刚刚使用 Wireshark 捕获了使用 ODBC 运行的 VBScript 生成的网络流量

    SELECT COUNT(*) AS n FROM TestData WHERE ID=1
    

    针对驻留在网络共享上的 84.3 MB Access 数据库文件。该文件由一 (1) 个表组成,该表包含一百万 (1,000,000) 行,并将 Long Integer [ID] 字段作为其主键。

    产生的总网络流量

    • 打开与数据库文件的 ODBC 连接,
    • 运行查询,
    • 返回结果,然后
    • 关闭连接

    为 110 KB。

    【讨论】:

    • 啊,一个知道什么是什么的好人!我从未见过任何关于这实际上是如何工作的。我很感兴趣。这里有几个问题: NAS 不能进行任何处理,因此当我的 PC 上的 Access 从 NAS 上的 accdb 文件中的 TABLE1 获取数据时,它必须获取表的整个索引以计算出它需要哪些行(因此使用页数据),然后它获取表中数据的子集。正确的?如果没有索引,我想它会从表中获取足够的数据来满足用户的需求(例如只显示 100 行,或者让整个表对字段 1,2 和 3 进行汇总)。
    • Access 将只读取足够的索引来确定必须检索哪些记录。考虑一个查询,它要求一个自动编号值,该值恰好是索引的第一个条目。它实际上只需要检查第一个条目即可找到指向匹配物理记录的指针。实际上,像表这样的索引是通过数据页存储和访问的……所以 Access 只需要读取该假设示例中的第一个索引页,而不是整个索引。如果索引不存在或不会被使用,很可能 Access 必须读取整个表(全表扫描)。
    • 有一点需要注意。并非所有 NAS 设备都支持 Access 使用的文件共享类型。否则,您将在多用户环境中遇到过多的 BE 损坏。几年前,当它发生在客户身上时,我发现了这一点。抱歉,我不记得技术细节了。
    • 感谢您的回答。我的问题仍然多于答案,但你让我走上了正确的道路。我找到了this explanation,现在明白了您所描述的内容是可能的,因为 mdb 具有使用页面的固定结构。但是这种类型的访问只有在相关程序可以直接与文件系统通信时才能工作。所以我假设 SMB 提供了某种在远程系统上执行此操作的功能。你会碰巧有一些更详细的信息吗?我还没有找到任何有用的东西。
    • 我做了更多的研究,我想我找到了我想要的东西。 SMB 确实允许文件打开调用来指定字节范围,写入调用也是如此。所以我只是假设 Odbc 必须相应地实现这些。然后剩下的归结为 Gord 和 Hansup 所描述的,以优化查询并创建智能索引。谁能确认一下?
    【解决方案2】:

    你的问题很好,我无法回答!

    但是:

    如果您正在使用和访问多个用户的前端和数据,MS 推荐:

    1. 您将数据库拆分为两个文件。一个拥有表格,另一个拥有其他所有内容(即前端文件)

    2. 每个用户都有一份前端文件的副本(这有时是必不可少的,但你可以不这样做,但不建议这样做,因为某些代码可能会搞砸多个用户!)

    因此,推送的只是数据,而不是表单和报告定义。

    这里有一些有趣的页面here

    简而言之:

    如果您使用的是 Microsoft Jet (.mdb) 数据库,则使用 DAO 类比使用 Microsoft Access ODBC 驱动程序更有效。

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2023-03-17
      • 2015-04-22
      • 2013-04-03
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多