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