MS Access指定链接表的表插入顺序?(NULL外键错误)

Kev*_*oid 5 sql-server ms-access

精简版

有没有办法强制(或提供)Microsoft Access以某种顺序(在表之间)执行插入(通过可更新的查询),或告诉它查询中的一列依赖于(自动 - 生成的值)该查询中的另一列?

版本更长

当我通过表单将值插入到可更新的查询中时,该查询跨越2个连接表(两者都是MS SQL Server上的链接表),我收到以下错误:

ODBC - 调用失败.

[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无法将值NULL插入列<fk column>',表'<tablename>'; 列不允许空值.INSERT失败(#515)[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]该语句已终止.(#3612)

这是因为Access无法识别第二个表的fk列应该与查询中第一个表的pk列具有相同的值(或者不能成功执行查询,因此会发生这种情况).

在通过Microsoft SQL Server ODBC连接器连接到MS SQL Server 2005(Express或Workgroup)的Access 2000,2003,2007上观察到此行为.

在家里玩

对于那些想在家里玩这个游戏的人来说,这里是如何重现我所描述的行为.首先,在SQL Server中创建测试表:

CREATE TABLE People
(
    PersonID INT IDENTITY NOT NULL
        CONSTRAINT PK_People PRIMARY KEY,
    FullName NVARCHAR(100) NOT NULL
);
CREATE TABLE Gamers
(
    PersonID INT NOT NULL
        CONSTRAINT PK_Gamers PRIMARY KEY
        CONSTRAINT FK_Gamers_People REFERENCES People (PersonID)
            ON DELETE CASCADE
            ON UPDATE CASCADE,
    Alias NVARCHAR(100) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

然后,创建一个新的空白Access数据库并创建引用上面创建的表的新链接表.在Relationships编辑器中创建表之间的关系(Access将正确地确定它是一对一的关系).然后创建以下查询:

SELECT People.PersonID AS People_PersonID, People.FullName,
    Gamers.PersonID AS Gamers_PersonID, Gamers.Alias
FROM People
    INNER JOIN Gamers ON People.PersonID = Gamers.PersonID;
Run Code Online (Sandbox Code Playgroud)

需要注意的是上面的查询(如输入,当然全名长)为正确通过数据集视图插入工作.

然后,创建一个表单,将RecordSource设置为上面的查询.为FullName和Alias创建文本框.然后切换到窗体视图并尝试插入数据.运气好的话,你会看到上面引用的错误信息.

可能的解决方法

解决此问题的一种方法是为子表中的数据创建子表单.通过合适的边框和着色,它对用户几乎是透明的.但是,这有一些问题.首先,必须添加额外的代码以防止在父表单完成之前输入子表单(否则Access将向用户提供关于主/子链接字段的密集错误).此外,用户无法对子表单中的任何字段进行排序/过滤,因为它只会过滤子表单记录(其中总是只有一个).话虽如此,这是我现在使用的解决方案.

我希望你们中的一个人知道更好的解决方案.谢谢阅读.

Fio*_*ala 1

你可以使用:

Private Sub FullName_AfterUpdate()
If Me.Dirty Then Me.Dirty = False

End Sub
Run Code Online (Sandbox Code Playgroud)

这将强制创建人员记录。