.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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...