如何使用带有绑定数据集的 VS19 获取 parent 记录的 Scope_identity 值

How to get the Scope_identity value for the parent record using VS19 with bound datasets

我在 MSSQL 中有两个相关的表 tbl1.PK tbl2.PK, tbl2FK(_tbl1PK)

我在 Visual Studio 中创建了一个数据集,它们显示了关系 当我将表作为数据网格放到表单上时,我得到了 parentDG 和 childDG。 VS 在添加保存过程的绑定导航器中添加

tbl1.bindingsource.endedit
tableadaptermanager.updateall

当我将数据添加到 parentDG 并按保存时,数据将保存到数据库中。 当我添加一个新的 parent 然后添加一个新的 child 详细信息并按保存时,我得到

System.Data.SqlClient.SqlException: 'The INSERT statement conflicted with the FOREIGN KEY constraint "FK_tblChild_tblParent". The conflict occurred in database "xxxxx", table "dbo.tblParent", column 'PK'.

我已尝试更新 parentTableadapter,然后更新 ds.acceptchanges,但我无法更新新的 child 行。

我明白为什么,但我的问题是:

我可以在数据集代码中看到插入命令:

Me._adapter.InsertCommand.CommandText = "INSERT INTO [] FROM tbl1 WHERE (PK= SCOPE_IDENTITY())"

但我一辈子都看不懂如何获得这个值。
我有很多包含很多列的表格,这就是为什么我 want/need 使用 IDE 的强大功能来填充和绑定我的控件,所以我真的不想走这条路手动创建我的数据集。

我对此进行了搜索和搜索,但找不到任何说明您如何使用 VS 自动生成代码执行此操作的内容。

谢谢

约翰

我刚刚测试过 InsertCommand 中的查询添加是自动发生的,所以你一定没有做正确的事情。这正是我所做的:

  1. 通过 SSMS 在我的本地默认 SQL 服务器实例上创建了一个名为 Test 的新数据库。
  2. 添加了一个 table 名为 Parent 的列 ParentId (int, PK, identity) 和 ParentName (varchar)。
  3. 添加了一个名为 Child 的 table,其中包含 ChildId(int、PK、identity)、ParentId(int)和 ChildName(varchar)列。
  4. 在父 table 的 ParentId 列中创建了子 table 到 ParentId 列的外键,将更新规则设置为级联。
  5. 创建了一个新的 VB Windows Forms 应用程序项目。
  6. 通过数据源 window 为测试数据库添加了新的数据源。
  7. 从数据集设计器中的解决方案资源管理器打开了 TestDataSet。
  8. 选择了两个数据表之间的数据关系。
  9. 在属性 window 中,单击“编辑关系”。
  10. 选中 'Both Relation and Foreign Key Constraint',当更新规则自动更改为级联时。

此时,即使在第 7 步之后,我也能够 select 设计器中的 ParentTableAdapter,展开 InsertCommand 并查看 CommandText 以查看以下内容:

INSERT INTO [dbo].[Parent] ([ParentName]) VALUES (@ParentName);
SELECT ParentId, ParentName FROM Parent WHERE (ParentId = SCOPE_IDENTITY())

如果看不到,可以自己设置。现在发生的情况是,当执行 InsertCommand 以插入新记录时,该查询会立即将该记录中的数据检索回您的 DataSet 中的 DataRow。这将使用新生成的值更新 ParentId 列,更新规则将导致该新值级联到子数据表中的任何相关数据行,因此您可以放心地继续插入它们。