sql-server - MS Access 指定链接表的表插入顺序? (空外键错误)

标签 sql-server ms-access

简短版本

有没有办法强制(或提供提示)Microsoft Access 按特定顺序(在表之间)执行插入(通过可更新查询),或者告诉它查询中的一列取决于 (该查询中另一列的自动生成值?

加长版本

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

ODBC--call failed.

[Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column <fk column>', table '<tablename>'; column does not allow nulls. INSERT fails (#515) [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (#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
);

然后,创建一个新的空白 Access 数据库并创建引用上面创建的表的新链接表。在关系编辑器中创建表之间的关系(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;

请注意,上面的查询确实可以正常通过数据集 View 插入(当然,只要输入 FullName)。

然后,创建一个表单,并将 RecordSource 设置为上面的查询。为全名和别名创建文本框。然后切换到表单 View 并尝试插入数据。运气好的话,您将看到上面引用的错误消息。

可能的解决方法

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

我希望你们中有人知道更好的解决方案。感谢您的阅读。

最佳答案

您可以使用:

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

End Sub

这将强制创建人员记录。

关于sql-server - MS Access 指定链接表的表插入顺序? (空外键错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4146754/

相关文章:

excel - 如何在Access数据库中使用左连接从Excel表中进行选择 - EXCEL VBA

sql - 你如何在 tsql contains 函数中搜索 & (符号)?

sql-server - 检查行是否存在后违反主键

php - 链接 MS Access 和数据库服务器而不安装任何额外的驱动程序

sql-server - "sp_updatestats"如何提高数据访问?

sql-server - 使用 Access 作为 SQL Server 的前端并具有暂存表

sql-server - SQL Server Profiler - 列含义

forms - 显示没有默认 Access 框架的 Access GUI

sql - 如何在 MS Access 查询中使用两个不同表中的值创建下拉列表(列表框)

performance - 更快地计算两个位置之间的距离(邮政编码)