简短版本
有没有办法强制(或提供提示)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/