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将向用户提供关于主/子链接字段的密集错误).此外,用户无法对子表单中的任何字段进行排序/过滤,因为它只会过滤子表单记录(其中总是只有一个).话虽如此,这是我现在使用的解决方案.
我希望你们中的一个人知道更好的解决方案.谢谢阅读.
你可以使用:
Private Sub FullName_AfterUpdate()
If Me.Dirty Then Me.Dirty = False
End Sub
Run Code Online (Sandbox Code Playgroud)
这将强制创建人员记录。
| 归档时间: |
|
| 查看次数: |
1628 次 |
| 最近记录: |