最后,我想更新数据库(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