我在MSSQL中有两个表,它们tbl1.PK
tbl2.PK
相关,tbl2FK(_tbl1PK)
我在Visual Studio中创建了一个数据集,它们以关系显示 当我将表作为数据网格拖放到表单上时,我得到了父 DG 和子 DG。 VS 添加了绑定导航器,该导航器添加了保存过程
tbl1.bindingsource.endedit
tableadaptermanager.updateall
当我将数据添加到父DG并按保存时,数据将保存到数据库中。 当我添加新的父母,然后添加新的子详细信息并按保存时,我得到
System.Data.SqlClient.SqlException:"INSERT 语句与 FOREIGN KEY 约束 "FK_tblChild_tblParent" 冲突。冲突发生在数据库"xxxxx"中,表"dbo.tblParent",列"PK"。
我尝试更新parentTableadapter
然后ds.acceptchanges
但我无法更新新的子行。
我明白为什么,但我的问题是:
VS IDE不应该处理这个问题吗?
如果不适合我,所以我认为我需要获得新
tbl1PK
(scope_identity)。
我可以在数据集代码中看到插入命令:
Me._adapter.InsertCommand.CommandText = "INSERT INTO [] FROM tbl1 WHERE (PK= SCOPE_IDENTITY())"
但是我一生都看不到如何获得这个价值。
我有很多表,有很多列,这就是为什么我想/需要使用 IDE 的强大功能来填充和绑定我的控件,所以我真的不想走手动创建数据集的路线。
我已经对此进行了搜索和搜索,但找不到任何说明如何使用VS自动生成的代码执行此操作的内容。
谢谢
John
我刚刚测试过,InsertCommand
中查询的添加是自动发生的,所以你一定没有正确地做某事。 这正是我所做的:
- 通过 SSMS 在本地默认 SQL Server 实例上创建了一个名为"测试"的新数据库。
- 添加了一个名为 Parent 的表,其中包含列 ParentId(int、PK、identity)和 ParentName (varchar)。
- 添加了一个名为 Child 的表,其中包含列 ChildId (int, PK, identity)、ParentId (int) 和 ChildName (varchar)。 在"子"表中从"父"表中的"父 ID"列
- 创建外键到"父级 ID"列,并将"更新规则"设置为"级联"。
- 创建了一个新的 VB Windows 窗体应用程序项目。
- 通过"数据源"窗口为"测试"数据库添加了新的数据源。
- 从数据集设计器中的解决方案资源管理器打开测试数据集。
- 选择了两个数据表之间的数据关系。
- 在"属性"窗口中,单击"编辑关系"。
- 选中"关系和外键约束",当更新规则自动更改为级联时。
在这一点上,但即使在步骤 7 之后,我也能够在设计器中选择 ParentTableAdapter,展开 InsertCommand 并查看 CommandText 以查看以下内容:
INSERT INTO [dbo].[Parent] ([ParentName]) VALUES (@ParentName);
SELECT ParentId, ParentName FROM Parent WHERE (ParentId = SCOPE_IDENTITY())
如果您没有看到,您可以自己设置。 现在发生的情况是,当执行 InsertCommand 以插入新记录时,该查询会立即将该记录中的数据检索回数据集中的 DataRow。 这将使用新生成的值更新 ParentId 列,并且更新规则将导致该新值级联到子数据表中的任何相关 DataRow,因此您可以继续插入它们而不必担心。