目前,我正在执行从Microsoft Access数据库到SQL Express 2010数据库的迁移。
基本上,我有一个搜索客户数据库的Access应用程序。访问应用程序分为两部分。每个客户端上的访问前端称为application.mdb,而Windows 2008服务器上的数据后端称为data.mdb。 application.mdb有3个链接表到data.mdb。持有客户,合同和物品。客户表与合同表(一对多)相关,合同表与项目表(一对多)相关
我使用相同的名称将data.mdb中的表导入到sql表中,并创建了相同的关系并将它们配置为级联。然后,我在客户端上创建了一个obdc连接,并更新了application.mdb中的3个链接表,指向sql server上的表。
我启动应用程序,一切似乎都很好,我可以完美地看到所有数据,性能提升非常值得付出努力。
然后我发现了一个问题,当我向数据库中添加一个新客户时,它会自动控制客户表和合同表而不是项目表....因此,如果我尝试更改项目表中的任何项目对于新客户我不能。我得到以下错误“无法添加记录;表”项目的主键“不在记录集”这是有道理的,因为SQL没有自动编号项目表。
我无法理解为什么......
非常感谢任何帮助。
答案 0 :(得分:2)
好吧,只需在项目视图中手动添加记录直接即可告诉您自动编号是否正常工作。在直接表视图中编辑+使用时,必须使自动编号工作。
一如既往,这些问题归结为细节。与访问应用程序相比,使用基于SQL的后端时有一点不同的是,在实际保存记录之前,基于服务器的系统不会生成自动编号(主键)。使用基于喷嘴的后端时,如果记录被弄脏,则自动编号可用。
因此,我会检查您是否在应用程序中运行某种类型的代码或事件,并尝试在实际保存记录之前将其用作主键值。
通常访问做得很好。例如,当您在访问中构建表单,然后在访问中创建子表单以编辑子记录(和子表)时,通常当焦点从主表单切换到子表单时,访问将强制执行保存主记录。因此,这意味着主键(自动编号列)现在可用于关系的正确运行。 Access可以并将使用此PK值,并将此值插入此子表中的外键值列中。
但是,只有在正确设置子窗体控件中的链接母版和链接子设置时才能访问上面的内容。作为在常规访问中构建表单的一般规则,Access可以检测所需的设置并将正确的值插入链接主文件并为您链接子设置。但是,链接表不会检测到FK列。
因此,当您使用SQL Server时,您必须在子表单控件中手动编辑和设置这些值。因此,我会检查您用于编辑此数据的子表单中的链接主文件和链接子设置,并确保设置了正确的值。如果这是VBA代码,则确保在尝试使用并获取PK值之前实际保存了记录。
我应该指出,即使在非基于SQL服务器的应用程序中,也是在子表单中设置链接主机+子设置,允许访问设置并为您维护此外键值。因此,访问总是能够为您插入这些值,并且它将与您共同编写任何代码。因此,在编辑过程中插入和维护这些值Access会为您完成所有工作(因此,不是为您插入这些FK值的数据引擎,而是用户界面或在某些情况下您编写的代码)
因此,除非您在该子表单控件中设置链接主机+子设置,否则访问将不会设置并插入这些正确的值。
我只是检查您在此处使用的任何子窗体控件中的链接母版和子母版设置是否正确。
答案 1 :(得分:1)
这听起来像是一个愚蠢的答案,但请检查Items表以确保自动编号已打开。
答案 2 :(得分:1)
每当您将Jet / ACE数据库迁移到SQL Server时,我建议的一件事就是彻底检查数据库设计,例如:密钥和约束的实现,数据类型的选择,索引的选择等。 / ACE与大多数SQL DBMS完全不同,因此您不应该认为适用于Jet / ACE的数据库设计自动适用于SQL DBMS。升迁向导并不总能识别出每个可能的问题。
在SQL Server中,最接近的“auto-number”是IDENTITY属性。检查以确定表中的哪些列是IDENTITY,并在需要时创建IDENTITY列。