如何在SQL大容量复制操作中的两个DataTable之间指定外键?

时间:2018-09-13 11:17:41

标签: c# asp.net datatable sqlbulkcopy

我有两个数据表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.");
                        }
                    }

1 个答案:

答案 0 :(得分:1)

我不会使用标识来链接两个表,而是会使用GUID来链接它们。像这样:

<a href ="#">hash</>
<a href ="#top">hashtop</>
<a href ="http://www.google.com">google</>

然后是孩子们

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;

这意味着您知道在插入之前,生成标识之前链接将是什么。