【问题标题】:MS Access Application - Convert data storage from Access to SQL ServerMS Access 应用程序 - 将数据存储从 Access 转换为 SQL Server
【发布时间】:2010-10-08 05:55:17
【问题描述】:

请记住,我不是 Access 专家。我精通 SQL Server 和 .Net 框架。这是我的情况:

承包商为我的公司构建了一个非常大的 MS Access 2007 应用程序。

应用程序已按访问分为两层;有一个前端部分保存所有 Ms Access 表单,然后是后端部分,即访问表、查询等,存储在网络上的计算机上。

当然,需要将数据存储部分转换为 SQL Server 2005,同时保留所有这些在 Ms Access 中构建的 GUI 表单。这就是我进来的地方。

我读了一点,发现您可以将表单甚至访问表链接到 SQL Server 表,但我仍然不确定具体可以做什么以及如何做。

有人做过吗?请评论有关此类工作的任何能力、限制和注意事项。谢谢!

【问题讨论】:

    标签: sql-server sql-server-2005 ms-access vba ms-access-2007


    【解决方案1】:

    不要使用 Access 的升迁向导:

    它会为你做很多事情:

    • 将数据从 Access 移至 SQL Server
    • 自动将表链接回 Access
    • 为您提供大量有关由于两个数据库的差异而导致的潜在问题的信息
    • 跟踪更改,以便您可以随着时间的推移使两者保持同步,直到迁移完成。

    我最近写了一个blog entry

    【讨论】:

    • 这里是用于访问的 SQL Server 2005 SSMA 的链接microsoft.com/sqlserver/2005/en/us/migration-access.aspx
    • 我发现 SSMA 非常有用。您可以在进行迭代更改时使用它来重复转换您的应用程序,对其进行测试,然后再重复一次,直到完成为止。
    【解决方案2】:

    您有几个选择,upsizing wizard 可以将结构和数据从对 Sql 的访问中移动。然后,您可以设置链接表,以便您的应用程序“应该”像现在一样工作。不幸的是,Access 使用的 Sql 方言与 Sql Server 不同,因此如果代码中有任何“原始 sql”语句,它们可能需要更改。

    尽管 Access 的所有其他功能、QBE、表单等都已链接到表格,但应该可以按预期工作。这是最简单也可能是最好的方法。

    解决此问题的另一种方法是如上所述迁移数据,然后在访问范围内使用 ADO,而不是使用链接表。如果您习惯于其他语言/开发环境,这种方法有点熟悉,但这是错误的方法。 Access 带有大量内置的东西,使处理数据变得非常容易,如果你重新使用 ADO/Sql,那么你就会失去许多这些好处。

    我建议从应用程序的一小部分开始 - 非必要数据,然后迁移一些表,看看情况如何。当然,您首先要备份所有内容。

    祝你好运

    【讨论】:

    • ODBC 负责将 Jet SQL 转换为与后端兼容的 SQL。换句话说,不,当 Jet 将它发送到 ODBC 驱动程序时,您在 Access 中编写的任何 Jet SQL 都不会被正确解释。这并不意味着它会运作良好,但它会运作。
    • 而且,顺便说一句,自 2003 版以来,在 Access 中,您有一个 SQL92 选项用于 SQL,这意味着您可以在 Access 中使用与 SQL Server 兼容的 SQL(这样如果您不熟悉 Jet SQL 方言,你可以使用你熟悉的东西)。
    • 不确定您所说的“SQL Server 兼容 SQL”是什么意思。它被称为 ANSI-92 查询模式,更类似于 SQL Server 语法,例如Access 帮助中的文字是:“在 Microsoft SQL Server 数据库中进行最小更改即可运行的查询”(office.microsoft.com/en-us/access/HP030704831033.aspx)
    • ...有很多 ACE/Jet SQL 关键字(例如 IIF)可以在 ANSI-92 查询模式下正常运行,除非更改(例如 IIF 替换为 CASE..当..否则..结束)。顺便说一句,查询模式称为“ANSI-92”,而不是“SQL-92”,后者是“ANSI-92”未能遵守的标准!
    【解决方案3】:

    其他人建议将 Jet 后端升级到 SQL Server 并通过 ODBC 进行链接。在理想情况下,该应用无需更改任何内容即可完美运行。

    在现实世界中,您会发现有些前端对象被设计为与 Jet 后端一起高效、快速地使用,但实际上它们不能很好地与服务器数据库一起使用。有时 Jet 猜错了,将一些非常低效的东西发送到服务器。对于记录的大规模更新尤其如此——为了不占用服务器资源(一件好事),Jet 将为每条记录发送一个 UPDATE 语句(这对您的应用程序来说是一件坏事,因为它太多了比单个 UPDATE 语句慢)。

    您需要做的是在升级应用程序后评估应用程序中的所有内容,并在存在性能问题的地方将一些逻辑移至服务器。这意味着您可以创建一些服务器端视图,或者您可以使用直通查询(将整个 SQL 语句交给 SQL Server,而不让 Jet 担心),或者您可能需要在服务器上创建存储过程(特别是对于更新操作)。

    但总的来说,假设 大部分 无需更改即可正常工作,这实际上是相当安全的。它可能不会像旧的 Access/Jet 应用程序那样快,但您可以在其中使用 SQL Profiler 来找出阻塞是什么,并重新构建事物以提高 SQL Server 后端的效率。

    如果 Access 应用程序已经被高效设计(例如,表单永远不会绑定到完整的表,而是绑定到具有限制性 WHERE 子句仅返回 1 条或几条记录的记录源),那么它可能会运行良好。另一方面,如果它使用了 Access 示例数据库和模板中的大量不良做法,您可能会遇到很大的问题。

    我的观点是,每个 Access/Jet 应用程序都应该从一开始就考虑到有一天它会被扩大规模以使用服务器后端。这意味着 Access/Jet 应用程序实际上将非常高效和快速,而且当您升迁时,它会造成最小的痛苦。

    【讨论】:

      【解决方案4】:

      这是您成本最低的选择。您将要为指向 SQL Server 的 Access 客户端设置 ODBC 连接。然后,您可以使用(我认为)“导入”选项通过 ODBC 源将表“链接”到 SQL Server。将您的数据从 Access 表迁移到 SQL Server,您可以在 SQL Server 上以您可以管理和备份的形式保存您的数据。重要的是,查询可以在 SQL Server 上作为视图编写,也可以作为链接表呈现给 Access db。

      【讨论】:

        【解决方案5】:

        链接访问表工作正常,但我只将它们与 ODBC 和其他数据库(Firebird、MySQL、Sqlite3)一起使用。有关主键或外键的信息没有通过。数据类型解释也存在问题:MySQL 中的日期与 Access VBA 中的日期不同。我猜这些问题在使用 SQL Server 时并没有那么严重。

        【讨论】:

        • Access 中链接表的唯一形式是 ODBC,除非有一个已经处理它的内置 ISAM(例如 Excel、DBF)。
        【解决方案6】:

        要点:如果您将 Access 中的表链接到 SQL Server,则每个表都必须定义一个主键(承包商?访问?经验表明,可能有些表没有 PK)。如果未定义 PK,则 Access 表单将无法更新和插入行,从而有效地将表呈现为只读。

        【讨论】:

        • 其实乍一看,这个数据库似乎设计的不错。我查看了显示大多数表之间关系的关系图,这表明使用了主键。
        • 在所有表中都有时间戳字段也很有帮助——这允许 Access 刷新数据而无需检查记录中的所有字段。当然,我只是在 Access 前端的所有 SQL Server 表中包含一个时间戳字段。
        • 不是每个表都必须有一个主键。 SQL Server 更喜欢这种做法,这是一种很好的做法。在没有主键的情况下更新 SS 后端表时会遇到问题,因此如果要更新表,则需要一个。 SSMA 会根据需要自动添加时间戳字段。
        【解决方案7】:

        看看这个 Access to SQL Server 迁移工具。它可能是少数(如果不是唯一的话)真正的对等或服务器到服务器迁移工具作为纯 Web 应用程序运行的工具之一。它主要使用 ASP 3.0、XML、文件系统对象、数据字典对象、ADO、ADO 扩展 (ADOX)、字典脚本对象和其他一些简洁的 Microsoft 技术和技术。如果您在一台服务器上拥有源访问表,而在另一台服务器甚至同一台服务器上拥有目标 SQL Server,并且您希望将其作为 Web Internet 解决方案运行,那么这就是适合您的产品。此示例讨论了 VPASP 购物车,但它适用于任何版本的 Access 以及从 SQL 2000 到 SQL 2008 的任何版本的 SQL Server。

        我正在完成通用数据库升级转换过程的开发,该过程涉及将 VPASP 购物或任何其他访问系统中的访问表、视图和索引结构自动转换为其 SQL Server 2005/2008 等效项。它直接在您的服务器上运行,无需外部员工或顾问的任何外部帮助。

        在 SQL Server 中创建 Access 表、索引和视图的克隆后,此数据迁移例程将选择性地将所有数据从 Access 表迁移到新的 SQL Server 2005/2008 表中,而无需提供您的实际 Access数据库或表格内容或您的密码给任何人。

        这是针对具有近 200 个表和近 300 个索引和视图的系统运行的过程的逆向工程部分,这是作为系统验收测试完成的。仍在进行中,但核心部分已经到位。

        http://www.21stcenturyecommerce.com/SQLDDL/ViewDBTables.asp

        我对 Access Table DDL(数据定义语言)进行自动逆向工程,并将它们转换为 SQL 等效的 DDL 语句,因为每个 VPASP 客户和每个版本的 VP- ASP 在那里。

        我正在完成实际的数据转换例程,该例程将在创建这些新 SQL 表(包括任何视图或索引)后将数据从 Access 迁移到 SQL Server。它完全用 ASP 编写,包含 VB 脚本、文件系统对象 (FSO)、字典对象、XML、DHTML、JavaScript,并且运行速度非常快,正如您在 SQL Server 2008 数据库中看到的那样例子。

        对近 500 个不同的数据库对象进行逆向工程可能需要 15-20 秒。对于涉及的 170 个表和 270 个索引,此示例中可能总共涉及 2,000 多个列。

        我什至想出了一种方法,让您在同一台服务器上使用 2 个不同的数据库连接文件并行运行两个 VPASP 系统,以确保在 Access System 和 SQL Server 系统上输入的订单产生相同的结果在实际切换到生产之前。

        约翰(a/k/a The SQL Dude) 销售@designersyles.biz (这是一个 VP-ASP 演示站点)

        【讨论】:

          【解决方案8】:

          这是我听一位开发人员谈到的一种技术。如果你真的想要一个客户端-服务器应用程序这样的东西。

          1. 创建分发给每个用户的 .mdb/.mde 前端文件(您会明白为什么)。
          2. 对于他们需要执行 CRUD 的每个表,在 #1 的文件中都有一个本地副本。
          3. 表单保持链接到本地​​表。
          4. 编写 VBA 代码来处理从本地表到 SQL Server 数据库的 CRUD。
          5. 报告可以基于从 SQL Server 创建的临时表(我认为不会在 mde 文件中创建临时表)。

          一旦您决定如何使用单个表单执行此操作,将相同的技术应用于其他表单并不难。在本地表上使用表单的好处是您可以将许多现有功能保留为现有应用程序(这就是他们使用并继续使用 Access 我希望的原因)。您只需要解决在 SQL Server 中来回获取数据的问题。

          您可以继续拥有链接表,然后随着时间和性能需求的要求,使用这种技术逐步淘汰它们。

          由于每个用户都有自己的本地文件,因此他们可以处理数据的本地副本。仅应在本地复制完成任务所需的最低要求。示例:如果他们正在更新单个记录,则表将只有该记录。当用户添加新记录时,您会注意到该记录的 ID 字段为 Null,因此需要插入语句。

          我猜本地表就像 .NET 中的数据集?我敢肯定这在某种程度上是一个不完美的类比。

          【讨论】:

          • 不知道为什么将表单绑定到本地表,这是您建议中记录源的结果(我也不会绑定到原始表)。
          • 复制数据总是一个坏主意。然后,当您将更新应用于真实数据时,您必须处理锁定/冲突。在我看来,这是一个寻找问题的解决方案。
          • 这需要服务器数据上的一个字段将一个字段“标记”为锁定,因为数据集/本地表断开连接。所有非动态记录集都是数据的副本吗? (通过这次讨论/辩论学到了很多东西 - 谢谢。)。
          猜你喜欢
          • 2015-12-25
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 2013-09-18
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多