【问题标题】:How to insert to table with one-to-one relationship via dataset如何通过数据集插入到具有一对一关系的表中
【发布时间】:2011-09-27 12:55:55
【问题描述】:

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

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

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

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

不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    为了享受 VS 的代码自动生成功能,我使用了 DataSet Designer。我们将第一个表称为 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),但这完全取决于您。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2017-11-23
      • 2013-07-20
      • 1970-01-01
      • 2018-06-25
      相关资源
      最近更新 更多