如何通过数据集插入到具有一对一关系的表

时间:2011-07-03 06:44:13

标签: c# asp.net dataset one-to-one dataadapter

我使用asp.net 4DataSets来访问数据库。数据库中有两个具有一对一关系的表。这意味着两个表都与主键具有相同的列(例如Id),其中一个表在此列集上具有@identity

因此,一般来说,如果我们要插入,我们先插入第一个表,而不是插入第二个表中,并使用table1中相应记录的id.table2 = id

我可以想象如何使用存储过程实现这一点(我们将插入第一个表并将id作为out参数,然后使用此id插入第二个表,btw都在一个事务中)。

但有没有办法在不使用存储过程的情况下执行此操作?可能是DataSets \ DataAdapters内​​置了这样的功能吗?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

今天它在这里很安静......好吧如果有人也在寻找这样的解决方案,我找到了一种方法。

所以我们的主要问题是在第一个表中获取新创建的记录的id。如果我们能够做到这一点,那么我们只需将它提供给下一个在第二个表中创建相应记录的方法。

我使用DataSet Designer来享受VS的代码自动生成功能。让我们调用第一个表TripSets。在DataSet Designer中,右键单击TripSetsTableAdapter,然后单击Properties。展开InsertCommand属性组。在这里,我们需要做两件事。

首先,我们使用Parameters Collection Editor将新参数添加到参数集合中。设置ParameterName = @TripId,DbType = Int32(或任何你需要的),Direction = Output。

其次,我们修改CommandText(为方便起见,使用Query Builder)。在分号之后添加另一个命令的结尾:

(...);
SELECT @TripId = SCOPE_IDENTITY()

所以你会得到类似这样的陈述:

INSERT INTO TripSets 
(Date, UserId)
VALUES     
(@Date,@UserId);
SELECT @TripId = SCOPE_IDENTITY()

也许你会得到一个解析器错误警告,但你可以忽略它。现在配置了这个,我们可以在我们的业务逻辑代码中使用如下:

int tripId;        
int result = tripSetsTableAdapter.Insert(tripDate, userId, out tripId);

// Here comes the insert method into the second table

tripSetTripSearchTableAdapter.Insert(tripId, amountPersons);

您可能希望以某种方式同步此操作(例如使用TransactionScope),但这完全取决于您。