MS Access应用程序 - 将数据存储从Access转换为SQL Server

时间:2009-02-18 00:47:59

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

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

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

该应用程序已分为两层BY ACCESS;有一个前端部分,它包含所有Ms Access表单,然后在后端部分,它们是存储在网络上的计算机上的访问表,查询等。

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

我已经阅读了一些内容,并且发现您可以将表单或甚至访问表链接到SQL Server表,但我仍然不确定可以做什么以及如何做。

有人这样做过吗?请评论有关此类承诺的任何能力,限制和考虑因素。谢谢!

8 个答案:

答案 0 :(得分:12)

不要使用Access中的升迁向导:

它会为你做很多事情:

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

我最近写了一篇关于它的blog entry

答案 1 :(得分:3)

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

虽然您已经链接到表,但Access的所有其他功能,QBE,表单等应该按预期工作。这是最简单也可能是最好的方法。

解决问题的另一种方法是如上所述迁移数据,然后在访问中使用ADO,而不是使用链接表。如果你已经习惯了其他语言/ dev环境,那么这种方法就像是一种方法,但这是错误的方法。访问带有大量内置的东西,这使得处理数据非常容易,如果你回去使用ADO / Sql,你就会失去很多好处。

我建议从应用程序的一小部分开始 - 非必要数据,并迁移几个表并查看它是如何进行的。当然,你先备份一切。

祝你好运

答案 2 :(得分:3)

其他人建议将Jet后端升级到SQL Server并通过ODBC进行链接。在理想的世界中,应用程序可以很好地工作而无需改变任何东西。

在现实世界中,您会发现一些使用Jet后端设计为高效且快速的前端对象实际上并不能很好地与服务器数据库配合使用。有时Jet猜错了,并且向服务器发送了效率非常低的东西。特别是大量更新记录的情况 - 为了不占用服务器资源(一件好事),Jet会为每条记录发送一个UPDATE语句(这对你的应用来说是件坏事,因为它很多,很多比单个UPDATE语句慢。)

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

但总的来说,假设大多数它可以在没有变化的情况下正常工作,这是非常安全的。它可能不会像旧的Access / Jet应用程序那么快,但是您可以使用SQL事件探查器来确定持久性是什么,并使用SQL Server后端重新构建事物以提高效率。

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

我认为每个Access / Jet应用程序都应该从一开始就设计为有一天它会升级为使用服务器后端。这意味着Access / Jet应用程序实际上非常高效和快速,但是当你升迁时,它会带来最小的痛苦。

答案 3 :(得分:2)

这是您的最低成本选项。您将要为指向SQL Server的Access客户端设置ODBC连接。然后,您可以使用(我认为)“导入”选项通过ODBC源将表“链接”到SQL Server。将数据从Access表迁移到SQL Server,您可以在可以管理和备份的表单中获取SQL Server上的数据。重要的是,查询可以作为视图写在SQL Server上,并作为链接表提供给Access数据库。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

看看这个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购物或任何其他Access系统中的访问表,视图和索引结构自动转换为其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系统上输入的订单产生相同的结果在实际转为生产之前。

John(a / k / a The SQL Dude) sales@designersyles.biz (这是一个VP-ASP演示网站)

答案 7 :(得分:-3)

这是我听过一位开发人员谈论的技巧。如果你真的想要像Client-Server应用程序那样的话。

  1. 创建分发给每个用户的.mdb / .mde前端文件(你会明白为什么)。
  2. 对于他们需要执行CRUD的每个表,在#1中的文件中都有一个本地副本。
  3. 表单保持链接到本地​​表。
  4. 编写VBA代码以处理从本地表到SQL Server数据库的CRUD。
  5. 报告可以基于从SQL Server创建的临时表(无法在mde文件中创建我不认为的临时表)。
  6. 一旦您决定如何使用单个表单执行此操作,将相同的技术应用于其他表单并不困难。在本地表上使用表单的好处是,您可以将许多现有功能保留为现有应用程序(这就是他们使用并继续使用Access的原因,我希望如此)。您只需要解决来回访问SQL Server的问题。

    您可以继续使用链接表,然后根据时间和性能需求逐步将其逐步淘汰。

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

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