加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

.net – 如何使用自动生成的身份密钥更新数据集父子表?

发布时间:2020-12-17 00:04:29 所属栏目:大数据 来源:网络整理
导读:我在VB应用程序中使用ADO.NET数据集.我有一个带有一个父表和许多子表的类型化数据集.我想在将数据插入父表时生成身份密钥,然后使用相同的密钥(作为Foregin密钥)更新所有子表中的数据. 最后,我想更新数据库(SQL Server08)中的数据集. 那么,上面的事情可以通过
我在VB应用程序中使用ADO.NET数据集.我有一个带有一个父表和许多子表的类型化数据集.我想在将数据插入父表时生成身份密钥,然后使用相同的密钥(作为Foregin密钥)更新所有子表中的数据.

最后,我想更新数据库(SQL Server08)中的数据集.

那么,上面的事情可以通过首先在数据库中直接插入父表,获取Identity列而不是用于Child表.

但是我想把它作为一个自动操作(就像LINQ to SQL一样,它处理datacontext中的Primary& Foreign键.)

我在Dataset中可以处理父表和子表的Autogenerated列吗?

谢谢,

ABB

我认为这应该更加明显,应该没有任何调整.但是,它仍然很容易.

解决方案有两个部分:

>在子表和父表之间创建DataRelation,并将其设置为在更新时级联.
这样,无论父ID发生变化,所有孩子都会更新.

Dim rel = ds.Relations.Add(parentTab.Columns("Id"),childTab.Columns("ParentId"))
rel.ChildKeyConstraint.UpdateRule = Rule.Cascade

>数据集插入和更新命令是双向的:
如果绑定了任何输出参数或返回了任何数据行,
它们将用于更新导致更新的数据集行.

这对于此特定问题最有用:获取自动生成的列
回到申请表.
除了身份之外,这可能是例如时间戳列.
但身份是最有用的.

我们需要做的就是设置insert命令来返回身份.
有几种方法可以做到这一点,例如:

a)使用带有输出参数的存储过程.这是“真实”数据库中最便携的方式.

b)使用多个SQL语句,最后一个返回插入的行.这是特定于SQL Server的AFAIK,但最简单的:

insert into Parent (Col1,Col2,...) values (@Col1,@Col2,...);
select * from Parent where Id = SCOPE_IDENTITY();

设置完成后,您需要做的就是创建具有唯一ID的父行(在单个数据集中),但在数据库中是不可能的.负数通常是一个不错的选择.然后,当您将数据集更改保存到数据库时,所有新的父行将从数据库中获取实际ID.

注意:如果您碰巧使用没有多语句支持且没有存储过程(例如Access)的数据库,则需要在父表适配器中的RowUpdated事件上设置事件处理程序.在hanler中,您需要通过select @@ IDENTITY命令获得身份.

一些链接:

> MSDN: Retrieving Identity or Autonumber Values (ADO.NET)
> MSDN: Managing an @@IDENTITY Crisis
> Retrieving Identity or Autonumber Values into Datasets
> C# Learnings: Updating identity columns in a Dataset

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读