1

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

所以一般来说,如果我们要插入,我们先插入到第一个表中,而不是插入到第二个表id.table2 = id中对应的记录在table1中。

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

但是有没有办法在不使用存储过程的情况下做到这一点?可能是 DataSets \ DataAdapters 内置了这样的功能吗?

将不胜感激任何帮助。

4

1 回答 1

1

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

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

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

首先,我们使用参数集合编辑器将一个新参数添加到参数集合中。设置 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),但这完全取决于您。

于 2011-07-03T14:46:17.843 回答