我使用asp.net 4
和DataSets
来访问数据库。数据库中有两个具有一对一关系的表。这意味着两个表都与主键具有相同的列(例如Id),其中一个表在此列集上具有@identity
。
因此,一般来说,如果我们要插入,我们先插入第一个表,而不是插入第二个表中,并使用table1中相应记录的id.table2 = id
。
我可以想象如何使用存储过程实现这一点(我们将插入第一个表并将id作为out参数,然后使用此id插入第二个表,btw都在一个事务中)。
但有没有办法在不使用存储过程的情况下执行此操作?可能是DataSets \ DataAdapters内置了这样的功能吗?
感谢任何帮助。
答案 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),但这完全取决于您。