猿问

如何在 SQL 批量复制操作中指定两个数据表之间的外键?

我有两个数据表 A 和 B。A 是父表。B 中的行包含一个引用 A 的字段 ParentId。


我想分别批量插入 A 和 B。插入A后,如何在B的对应子行中设置ParentId?


更新:


我有以下用于创建数据表的代码:


    var a= new DataTable("A");


    DataColumn id= new DataColumn("Id", typeof(int));

    billablePriceMapId.AutoIncrement = true;

    billable.Columns.Add(id);


    DataColumn fee = new DataColumn("Fee", typeof(decimal));

    billable.Columns.Add(fee);


    DataColumn[] keys = new DataColumn[1];

    keys[0] = id;

    billable.PrimaryKey = keys;

对于子表:


    var b= new DataTable("B");


    DataColumn id= new DataColumn("Id", typeof(int));

    billablePriceMapId.AutoIncrement = true;

    billable.Columns.Add(id);


    DataColumn parentId= new DataColumn("ParentId", typeof(int));

    billable.Columns.Add(parentId);


    DataColumn[] keys = new DataColumn[1];

    keys[0] = id;

    billable.PrimaryKey = keys;

我没有在两个表之间建立任何关系。我想知道如何以正确的方式做到这一点。


以下是我用于批量插入的代码:


using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))

                    {

                        try

                        {

                            bulkCopy.DestinationTableName = "dbo.A";

                            bulkCopy.WriteToServer(a);


                            bulkCopy.DestinationTableName = "dbo.B";

                            bulkCopy.WriteToServer(b);

                        }

                        catch (Exception ex)

                        {

                            Logger.Error(ex, "Bulk copy operation failed.");

                        }

                    }


烙印99
浏览 154回答 2
2回答

小怪兽爱吃肉

我不会使用标识来链接两个表,而是使用 GUID 来链接它们。像这样 :var a= new DataTable("A");DataColumn guid= new DataColumn("Guid", typeof(Guid));billable.Columns.Add(Guid.NewGuid());DataColumn id= new DataColumn("Id", typeof(int));billablePriceMapId.AutoIncrement = true;billable.Columns.Add(id);DataColumn fee = new DataColumn("Fee", typeof(decimal));billable.Columns.Add(fee);DataColumn[] keys = new DataColumn[1];keys[0] = id;billable.PrimaryKey = keys;然后为了孩子var b= new DataTable("B");DataColumn id= new DataColumn("Id", typeof(int));billablePriceMapId.AutoIncrement = true;billable.Columns.Add(id);DataColumn parentId= new DataColumn("ParentGuid", typeof(Guid));billable.Columns.Add(parentGuid);DataColumn[] keys = new DataColumn[1];keys[0] = id;billable.PrimaryKey = keys;这意味着您在插入之前知道链接将是什么,在生成标识之前。

哔哔one

SqlBulkCopy不返回标识值。因此,除非您的表A有另一个唯一列(例如“代码”)以允许完善SELECT,否则您将无法检索生成的标识值。免责声明:我是Bulk Operations项目的所有者这个库不是免费的,但允许输出标识值。它在引擎盖下SqlBulkCopy使用Temporary Table以允许此功能using (var bulkCopy = new BulkOperation(connection)){    bulkCopy.Transaction = transaction;    bulkCopy.DestinationTableName = "dbo.A";    bulkCopy.ColumnMappings.Add("Id", ColumnMappingDirectionType.Output);    bulkCopy.ColumnMappings.Add("Col1");    bulkCopy.ColumnMappings.Add("Col2");    bulkCopy.BulkInsert(a);    // Copy identity value in `Id` from table A to `ParentId` in table B    // ...code...}
随时随地看视频慕课网APP
我要回答