微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐