2011-05-23 135 views
2

当前我正在执行从Microsoft Access数据库到SQL Express 2010数据库的迁移。将Access数据库转换为SQL

基本上,我有一个搜索客户数据库的Access应用程序。访问应用程序分为两部分开发。每个客户端上的访问前端名为application.mdb,而在Windows 2008服务器上的数据后端名为data.mdb。 application.mdb具有3个到data.mdb的链接表。持有客户和合同以及物品。客户表涉及到合同表(一对多)和合同表涉及到的项目表(一对多)

我将data.mdb中的表导入到sql表中并以相同的名称创建并创建相同的关系并将它们配置为级联。然后,我在客户端上创建了一个obdc连接,并更新了application.mdb中的3个链接表以指向sql server上的表。

我启动应用程序,一切似乎都很好,我可以完美地看到所有数据,性能提升非常值得。

然后,我发现一个问题,当我添加一个新的客户到数据库时,它自动编号客户表和合同表,但不是项目表....因此,如果我试图改变项目中的任何项目新客户的桌子我不能。我得到以下错误“无法添加记录;”表“项”的主键不在记录集“这是有道理的,因为SQL没有自动编号的项目表。

我不明白为什么....

任何帮助将不胜感激。

+2

你可以发表项目表def吗? – roberttdev 2011-05-23 12:44:19

+0

您是否试图在绑定到SQL语句的窗体中添加记录,这些SQL语句中有多个表? – 2011-05-28 23:46:07

+0

此外,请确保每个表都有一个时间戳字段。如果您使用SSMA for Access迁移数据,您可能会获得更好的结果,因为它足够聪明,可以将事物从Jet/ACE转换为SQL Server,从而最大限度地减少事件中断的可能性(并且它会添加时间戳记字段为你自动)。 – 2011-05-28 23:49:33

回答

1

这听起来像一个愚蠢的答案,但检查项目表,以确保自动编号打开。

+0

正如我上面提到的,在SQL DB中,我已经在项目表中将主键设置为名为“itemID”的列,并且它具有以1递增的标识 – Robert 2011-05-23 16:26:17

1

当你将Jet/ACE数据库迁移到SQL Server时,我会建议的一件事是彻底检查数据库设计,例如:键和约束的实现,数据类型的选择,索引的选择等。 Jet/ACE与大多数SQL DBMS非常不同,因此您不应该认为适用于Jet/ACE的数据库设计自动适用于SQL DBMS。升迁向导并不总是能够识别每一个可能的问题。

在SQL Server中,最接近的“自动编号”是IDENTITY属性。检查以确定表中的哪些列是IDENTITY,并在需要时创建一个IDENTITY列。

+0

在SQL DB中,我已将主键设置为项目表作为名为“itemID”的列,并且它的身份加1。 – Robert 2011-05-23 16:25:07

2

那么,只是手动添加记录直接在项目视图应告诉你,如果自动编号工作。当您在直接表格视图中编辑+使用时,您必须使自动编号起作用。

像往常一样,这些问题归结到细节。使用基于SQL的后端与访问应用程序进行比较时,有一点是不同的,那就是在实际保存记录之前,不会在基于服务器的系统上生成自动编号(主键)。在使用基于喷气机的后端时,自动编号在记录变脏时即可使用。

因此,我会检查是否有一些类型的代码或事件正在试图用作主键值的应用程序在记录被实际保存之前运行。

通常访问做得不错。例如,当您在访问中构建表单,然后有子窗体访问编辑子记录(和子表)时,通常当焦点从主窗体切换到子窗体时,访问将强制保存主要记录。这意味着主键(自动编号栏)现在可用于关系的正确运行。 Access可以并将使用此PK值,并将此值插入此子表中的外键值列中。

但是,只有当您在子窗体控件中正确设置链接主链接和链接子设置时,访问才会为您完成。作为在常规访问中构建表单的一般规则,Access可以检测所需的设置,并将正确的值插入链接主设备并为您链接子设置。但是,链接表不会检测到FK列。

因此,当您使用SQL Server时,您必须在子窗体控件中手动编辑和设置这些值。因此,我会检查您用于编辑此数据的子表单中的链接主链接和子链接设置,并确保设置了正确的值。如果这是VBA代码,那么确保在尝试使用并获取PK值之前实际保存记录。

我应该指出,即使在非基于SQL服务器的应用程序中,它也是在子窗体中设置链接主控+子设置,以允许访问设置并为您维护此外键值。所以访问总是有能力为你插入这些值,并且它会根据你的需要编写任何代码。因此,在插入和维护这些值的编辑过程中,Access会为您完成所有工作(因此不是数据引擎会为您插入这些FK值,而是用户界面或某些情况下编写代码)

因此,访问不会设置并插入这些正确的值,除非您在该子窗体控件中设置链接主控+子设置。

我只是简单地检查您的链接主控和子主控设置在您使用的任何子控件中是否正确。

+0

这正是问题所在,我没有意识到SQL不会像访问一样管理自动增量。你有没有可以管理这个过程的示例代码? – Robert 2011-05-26 00:54:42

+0

Albert刚刚解释了如何通过设计您的用户界面来管理它,以便Access可以为您解决问题。没有必要的代码。 – 2011-05-28 23:45:48

相关问题