如何使用带有绑定数据集的 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 行。
我明白为什么,但我的问题是:
不是 VS IDE 应该处理这个吗?
if 不适合我,所以我想我需要获得新的 tbl1PK
(scope_identity)。
我可以在数据集代码中看到插入命令:
Me._adapter.InsertCommand.CommandText = "INSERT INTO [] FROM tbl1 WHERE (PK= SCOPE_IDENTITY())"
但我一辈子都看不懂如何获得这个值。
我有很多包含很多列的表格,这就是为什么我 want/need 使用 IDE 的强大功能来填充和绑定我的控件,所以我真的不想走这条路手动创建我的数据集。
我对此进行了搜索和搜索,但找不到任何说明您如何使用 VS 自动生成代码执行此操作的内容。
谢谢
约翰
我刚刚测试过 InsertCommand
中的查询添加是自动发生的,所以你一定没有做正确的事情。这正是我所做的:
- 通过 SSMS 在我的本地默认 SQL 服务器实例上创建了一个名为 Test 的新数据库。
- 添加了一个 table 名为 Parent 的列 ParentId (int, PK, identity) 和 ParentName (varchar)。
- 添加了一个名为 Child 的 table,其中包含 ChildId(int、PK、identity)、ParentId(int)和 ChildName(varchar)列。
- 在父 table 的 ParentId 列中创建了子 table 到 ParentId 列的外键,将更新规则设置为级联。
- 创建了一个新的 VB Windows Forms 应用程序项目。
- 通过数据源 window 为测试数据库添加了新的数据源。
- 从数据集设计器中的解决方案资源管理器打开了 TestDataSet。
- 选择了两个数据表之间的数据关系。
- 在属性 window 中,单击“编辑关系”。
- 选中 '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 列,更新规则将导致该新值级联到子数据表中的任何相关数据行,因此您可以放心地继续插入它们。
我在 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 行。
我明白为什么,但我的问题是:
不是 VS IDE 应该处理这个吗?
if 不适合我,所以我想我需要获得新的
tbl1PK
(scope_identity)。
我可以在数据集代码中看到插入命令:
Me._adapter.InsertCommand.CommandText = "INSERT INTO [] FROM tbl1 WHERE (PK= SCOPE_IDENTITY())"
但我一辈子都看不懂如何获得这个值。
我有很多包含很多列的表格,这就是为什么我 want/need 使用 IDE 的强大功能来填充和绑定我的控件,所以我真的不想走这条路手动创建我的数据集。
我对此进行了搜索和搜索,但找不到任何说明您如何使用 VS 自动生成代码执行此操作的内容。
谢谢
约翰
我刚刚测试过 InsertCommand
中的查询添加是自动发生的,所以你一定没有做正确的事情。这正是我所做的:
- 通过 SSMS 在我的本地默认 SQL 服务器实例上创建了一个名为 Test 的新数据库。
- 添加了一个 table 名为 Parent 的列 ParentId (int, PK, identity) 和 ParentName (varchar)。
- 添加了一个名为 Child 的 table,其中包含 ChildId(int、PK、identity)、ParentId(int)和 ChildName(varchar)列。
- 在父 table 的 ParentId 列中创建了子 table 到 ParentId 列的外键,将更新规则设置为级联。
- 创建了一个新的 VB Windows Forms 应用程序项目。
- 通过数据源 window 为测试数据库添加了新的数据源。
- 从数据集设计器中的解决方案资源管理器打开了 TestDataSet。
- 选择了两个数据表之间的数据关系。
- 在属性 window 中,单击“编辑关系”。
- 选中 '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 列,更新规则将导致该新值级联到子数据表中的任何相关数据行,因此您可以放心地继续插入它们。